1. 程式人生 > >Spring、Spring MVC、Struts2、、優缺點整理

Spring、Spring MVC、Struts2、、優缺點整理

開發十年,就只剩下這套架構體系了! >>>   

Spring 及其優點

大部分專案都少不了Spring的身影,為什麼大家對他如此青睞,而且對他的追捧絲毫沒有減退之勢呢

Spring是什麼:

Spring是一個輕量級的DI和AOP容器框架。

說它輕量級有一大部分原因是相對與EJB的(雖然本人從沒有接觸過EJB的應用),重要的是,Spring是非侵入式的,基於spring開發的應用一般不依賴於spring的類。

 

DI:稱作依賴注入(Dependency Injection),和控制反轉一個概念,具體的講,當一個角色需要另外一個角色協助的時候,在傳統的程式設計中,通常有呼叫者來建立被呼叫者的例項。但是在spring中建立被呼叫者將不再有呼叫者完成,因此叫控制反轉。建立被呼叫物件有Spring來完成,在容器例項化物件的時候主動的將被呼叫者(或者說它的依賴物件)注入給呼叫物件,因此又叫依賴注入。

AOP:Spring對面向切面程式設計提供了強有力的支援,通過它讓我們將業務邏輯從應用服務(如事務管理)中分離出來,實現了高內聚開發,應用物件只關注業務邏輯,不再負責其它系統問題(如日誌、事務等)。Spring支援使用者自定義切面。

面向切面程式設計是面向物件程式設計的有力補充。面向物件程式設計將程式分成各個層次的物件,面向切面的程式將執行過程分解成各個切面。AOP是從執行程式的角度去考慮程式的結構,提取業務處理過程的切面,OOP是靜態的抽象,AOP是動態的抽象,是對應用執行過程的步驟進行抽象,從而獲得步驟之間的邏輯劃分。

容器:Spring是個容器,因為它包含並且管理應用物件的生命週期和配置。如物件的建立、銷燬、回撥等。

框架:Spring作為一個框架,提供了一些基礎功能,(如事務管理,持久層整合等),使開發人員更專注於開發應用邏輯。

 

看完了Spring是什麼,再來看看Spring有哪些優點

1.使用Spring的IOC容器,將物件之間的依賴關係交給Spring,降低元件之間的耦合性,讓我們更專注於應用邏輯

2.可以提供眾多服務,事務管理,WS等。

3.AOP的很好支援,方便麵向切面程式設計。

4.對主流的框架提供了很好的整合支援,如Hibernate,Struts2,JPA等

5.Spring DI機制降低了業務物件替換的複雜性。

6.Spring屬於低侵入,程式碼汙染極低。

7.Spring的高度可開放性,並不強制依賴於Spring,開發者可以自由選擇Spring部分或全部

Struts2的優點

Struts2 是一個相當強大的Java Web開源框架,是一個基於POJO的Action的MVC Web框架。它基於當年的Webwork和XWork框架,繼承其優點,同時做了相當的改進。Struts2現在在Java Web開發界的地位可以說是大紅大紫,從開發人員的角度來分析,Struts2之所以能夠如此的深入開發人員之心,與其優良的設計是分不開的。


 

1、Struts2基於MVC架構,框架結構清晰,開發流程一目瞭然,開發人員可以很好的掌控開發的過程。

我在專案開發過程中,一個具體的功能的開發流程是:拿到一個具體的功能需求文件和設計好的前臺介面(在開發中我不負責設計頁面),分析需要從前臺傳遞哪些引數,確定引數的變數名稱,在Action中設定相應的變數,這些引數在前臺如何顯示,並將頁面上的一些控制元件適當使用Struts2提供的伺服器端控制元件來代替,編寫Action對應的方法來完成業務邏輯,最後,做一些與配置檔案相關的設定。當然實際的開發比這個過程要複雜,涉及到資料庫,驗證,異常等處理。但是使用Struts2進行開發,你的關注點絕大部分是在如何實現業務邏輯上,開發過程十分清晰明瞭。

 

2、使用OGNL進行引數傳遞。

OGNL提供了在Struts2裡訪問各種作用域中的資料的簡單方式,你可以方便的獲取Request,Attribute,Application,Session,Parameters中的資料。大大簡化了開發人員在獲取這些資料時的程式碼量。

 

3、強大的攔截器

Struts2 的攔截器是一個Action級別的AOP,Struts2中的許多特性都是通過攔截器來實現的,例如異常處理,檔案上傳,驗證等。攔截器是可配置與重用的,可以將一些通用的功能如:登入驗證,許可權驗證等置於攔截器中以完成一些Java Web專案中比較通用的功能。在我實現的的一Web專案中,就是使用Struts2的攔截器來完成了系統中的許可權驗證功能。

4、易於測試

Struts2的Action都是簡單的POJO,這樣可以方便的對Struts2的Action編寫測試用例,大大方便了Java Web專案的測試。

 

5、易於擴充套件的外掛機制

在Struts2新增擴充套件是一件愉快而輕鬆的事情,只需要將所需要的Jar包放到WEB-INF/lib資料夾中,在struts.xml中作一些簡單的設定就可以實現擴充套件。常用的Struts2的擴充套件可以通過這個連結找到:

http://cwiki.apache.org/S2PLUGINS/home.html

 

6、模組化

Struts2已經把模組化作為了體系架構中的基本思想,可以通過三種方法來將應用程式模組化:

將配置資訊拆分成多個檔案

把自包含的應用模組建立為外掛

建立新的框架特性,即將與特定應用無關的新功能組織成外掛,以新增到多個應用中去。

 

7、全域性結果與宣告式異常

為應用程式新增全域性的Result,和在配置檔案中對異常進行處理,這樣當處理過程中出現指定異常時,可以跳轉到特定頁面,這一功能十分實用。

 

Spring MVC和Struts2的比較的優點

我們用struts2時採用的傳統的配置檔案的方式,並沒有使用傳說中的0配置。spring3 mvc可以認為已經100%零配置了(除了配置spring mvc-servlet.xml外)。

Spring MVC和Struts2的區別:

  1. 機制:spring mvc的入口是servlet,而struts2是filter(這裡要指出,filter和servlet是不同的。以前認為filter是 servlet的一種特殊),這樣就導致了二者的機制不同,這裡就牽涉到servlet和filter的區別了。

  2. 效能:spring會稍微比struts快。spring mvc是基於方法的設計,而sturts是基於類,每次發一次請求都會例項一個action,每個action都會被注入屬性,而spring基於方法,粒度更細,但要小心把握像在servlet控制資料一樣。spring3 mvc是方法級別的攔截,攔截到方法後根據引數上的註解,把request資料注入進去,在spring3 mvc中,一個方法對應一個request上下文。而struts2框架是類級別的攔截,每次來了請求就建立一個Action,然後呼叫setter getter方法把request中的資料注入;struts2實際上是通過setter getter方法與request打交道的;struts2中,一個Action物件對應一個request上下文。

  3. 引數傳遞:struts是在接受引數的時候,可以用屬性來接受引數,這就說明引數是讓多個方法共享的。

  4. 設計思想上:struts更加符合oop的程式設計思想, spring就比較謹慎,在servlet上擴充套件。

  5. intercepter的實現機制:struts有以自己的interceptor機制,spring mvc用的是獨立的AOP方式。這樣導致struts的配置檔案量還是比spring mvc大,雖然struts的配置能繼承,所以我覺得論使用上來講,spring mvc使用更加簡潔,開發效率Spring MVC確實比struts2高。spring mvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,所以說從架構本身上spring3 mvc就容易實現restful url。struts2是類級別的攔截,一個類對應一個request上下文;實現restful url要費勁,因為struts2 action的一個方法可以對應一個url;而其類屬性卻被所有方法共享,這也就無法用註解或其他方式標識其所屬方法了。spring3 mvc的方法之間基本上獨立的,獨享request response資料,請求資料通過引數獲取,處理結果通過ModelMap交回給框架方法之間不共享變數,而struts2搞的就比較亂,雖然方法之間也是獨立的,但其所有Action變數是共享的,這不會影響程式執行,卻給我們編碼,讀程式時帶來麻煩。

  6. 另外,spring3 mvc的驗證也是一個亮點,支援JSR303,處理ajax的請求更是方便,只需一個註解@ResponseBody ,然後直接返回響應文字即可。送上一段程式碼:

    1. @RequestMapping(value=“/whitelists”)

    2. public String index(ModelMap map) {

    3. Account account = accountManager.getByDigitId(SecurityContextHolder.get().getDigitId());

    4. List groupList = groupManager.findAllGroup(account.getId());

    5. map.put(“account”, account);

    6. map.put(“groupList”, groupList);

    7. return “/group/group-index”;

    8. }

    9. // @ResponseBody ajax響應,處理Ajax請求也很方便

    10. @RequestMapping(value=“/whitelist/{whiteListId}/del”)

    11. @ResponseBody

    12. public String delete(@PathVariable Integer whiteListId) {

    13. whiteListManager.deleteWhiteList(whiteListId);

    14. return “success”;

    15. }

 技術的提升是需要下苦工,需要堅持不懈的努力。就比如下面的分享的這些技術點,是否都學會並掌握了呢?如需要以下圖譜以及跟多提升架構技術的資源可加入我的粉絲Qqun:855801563。我花了將近一個月時間蒐集整理了一套架構技術提升知識點講解以及一些面試題解析和答案免費分享給大家。助力各位程式設計師朋友突破自我提升技能,實