javascript
Spring、Spring MVC、Struts2、、优缺点整理
Spring 及其優(yōu)點
大部分項目都少不了Spring的身影,為什么大家對他如此青睞,而且對他的追捧絲毫沒有減退之勢呢
Spring是什么:
Spring是一個輕量級的DI和AOP容器框架。
說它輕量級有一大部分原因是相對與EJB的(雖然本人從沒有接觸過EJB的應(yīng)用),重要的是,Spring是非侵入式的,基于spring開發(fā)的應(yīng)用一般不依賴于spring的類。
DI:稱作依賴注入(Dependency Injection),和控制反轉(zhuǎn)一個概念,具體的講,當(dāng)一個角色需要另外一個角色協(xié)助的時候,在傳統(tǒng)的程序設(shè)計中,通常有調(diào)用者來創(chuàng)建被調(diào)用者的實例。但是在spring中創(chuàng)建被調(diào)用者將不再有調(diào)用者完成,因此叫控制反轉(zhuǎn)。創(chuàng)建被調(diào)用對象有Spring來完成,在容器實例化對象的時候主動的將被調(diào)用者(或者說它的依賴對象)注入給調(diào)用對象,因此又叫依賴注入。
AOP:Spring對面向切面編程提供了強(qiáng)有力的支持,通過它讓我們將業(yè)務(wù)邏輯從應(yīng)用服務(wù)(如事務(wù)管理)中分離出來,實現(xiàn)了高內(nèi)聚開發(fā),應(yīng)用對象只關(guān)注業(yè)務(wù)邏輯,不再負(fù)責(zé)其它系統(tǒng)問題(如日志、事務(wù)等)。Spring支持用戶自定義切面。
面向切面編程是面向?qū)ο缶幊痰挠辛ρa(bǔ)充。面向?qū)ο缶幊虒⒊绦蚍殖筛鱾€層次的對象,面向切面的程序?qū)⑦\(yùn)行過程分解成各個切面。AOP是從運(yùn)行程序的角度去考慮程序的結(jié)構(gòu),提取業(yè)務(wù)處理過程的切面,OOP是靜態(tài)的抽象,AOP是動態(tài)的抽象,是對應(yīng)用執(zhí)行過程的步驟進(jìn)行抽象,從而獲得步驟之間的邏輯劃分。容器:Spring是個容器,因為它包含并且管理應(yīng)用對象的生命周期和配置。如對象的創(chuàng)建、銷毀、回調(diào)等。
框架:Spring作為一個框架,提供了一些基礎(chǔ)功能,(如事務(wù)管理,持久層集成等),使開發(fā)人員更專注于開發(fā)應(yīng)用邏輯。
看完了Spring是什么,再來看看Spring有哪些優(yōu)點
1.使用Spring的IOC容器,將對象之間的依賴關(guān)系交給Spring,降低組件之間的耦合性,讓我們更專注于應(yīng)用邏輯
2.可以提供眾多服務(wù),事務(wù)管理,WS等。
3.AOP的很好支持,方便面向切面編程。
4.對主流的框架提供了很好的集成支持,如Hibernate,Struts2,JPA等
5.Spring DI機(jī)制降低了業(yè)務(wù)對象替換的復(fù)雜性。
6.Spring屬于低侵入,代碼污染極低。
7.Spring的高度可開放性,并不強(qiáng)制依賴于Spring,開發(fā)者可以自由選擇Spring部分或全部
Struts2的優(yōu)點
Struts2 是一個相當(dāng)強(qiáng)大的Java Web開源框架,是一個基于POJO的Action的MVC Web框架。它基于當(dāng)年的Webwork和XWork框架,繼承其優(yōu)點,同時做了相當(dāng)?shù)母倪M(jìn)。Struts2現(xiàn)在在Java Web開發(fā)界的地位可以說是大紅大紫,從開發(fā)人員的角度來分析,Struts2之所以能夠如此的深入開發(fā)人員之心,與其優(yōu)良的設(shè)計是分不開的。1、Struts2基于MVC架構(gòu),框架結(jié)構(gòu)清晰,開發(fā)流程一目了然,開發(fā)人員可以很好的掌控開發(fā)的過程。我在項目開發(fā)過程中,一個具體的功能的開發(fā)流程是:拿到一個具體的功能需求文檔和設(shè)計好的前臺界面(在開發(fā)中我不負(fù)責(zé)設(shè)計頁面),分析需要從前臺傳遞哪些參數(shù),確定參數(shù)的變量名稱,在Action中設(shè)置相應(yīng)的變量,這些參數(shù)在前臺如何顯示,并將頁面上的一些控件適當(dāng)使用Struts2提供的服務(wù)器端控件來代替,編寫Action對應(yīng)的方法來完成業(yè)務(wù)邏輯,最后,做一些與配置文件相關(guān)的設(shè)置。當(dāng)然實際的開發(fā)比這個過程要復(fù)雜,涉及到數(shù)據(jù)庫,驗證,異常等處理。但是使用Struts2進(jìn)行開發(fā),你的關(guān)注點絕大部分是在如何實現(xiàn)業(yè)務(wù)邏輯上,開發(fā)過程十分清晰明了。
2、使用OGNL進(jìn)行參數(shù)傳遞。OGNL提供了在Struts2里訪問各種作用域中的數(shù)據(jù)的簡單方式,你可以方便的獲取Request,Attribute,Application,Session,Parameters中的數(shù)據(jù)。大大簡化了開發(fā)人員在獲取這些數(shù)據(jù)時的代碼量。
3、強(qiáng)大的攔截器Struts2 的攔截器是一個Action級別的AOP,Struts2中的許多特性都是通過攔截器來實現(xiàn)的,例如異常處理,文件上傳,驗證等。攔截器是可配置與重用的,可以將一些通用的功能如:登錄驗證,權(quán)限驗證等置于攔截器中以完成一些Java Web項目中比較通用的功能。在我實現(xiàn)的的一Web項目中,就是使用Struts2的攔截器來完成了系統(tǒng)中的權(quán)限驗證功能。
4、易于測試Struts2的Action都是簡單的POJO,這樣可以方便的對Struts2的Action編寫測試用例,大大方便了Java Web項目的測試。
5、易于擴(kuò)展的插件機(jī)制在Struts2添加擴(kuò)展是一件愉快而輕松的事情,只需要將所需要的Jar包放到WEB-INF/lib文件夾中,在struts.xml中作一些簡單的設(shè)置就可以實現(xiàn)擴(kuò)展。常用的Struts2的擴(kuò)展可以通過這個鏈接找到:http://cwiki.apache.org/S2PLUGINS/home.html
6、模塊化Struts2已經(jīng)把模塊化作為了體系架構(gòu)中的基本思想,可以通過三種方法來將應(yīng)用程序模塊化:將配置信息拆分成多個文件把自包含的應(yīng)用模塊創(chuàng)建為插件創(chuàng)建新的框架特性,即將與特定應(yīng)用無關(guān)的新功能組織成插件,以添加到多個應(yīng)用中去。
7、全局結(jié)果與聲明式異常為應(yīng)用程序添加全局的Result,和在配置文件中對異常進(jìn)行處理,這樣當(dāng)處理過程中出現(xiàn)指定異常時,可以跳轉(zhuǎn)到特定頁面,這一功能十分實用。
Spring MVC和Struts2的比較的優(yōu)點
我們用struts2時采用的傳統(tǒng)的配置文件的方式,并沒有使用傳說中的0配置。spring3 mvc可以認(rèn)為已經(jīng)100%零配置了(除了配置spring mvc-servlet.xml外)。
Spring MVC和Struts2的區(qū)別:
機(jī)制:spring mvc的入口是servlet,而struts2是filter(這里要指出,filter和servlet是不同的。以前認(rèn)為filter是 servlet的一種特殊),這樣就導(dǎo)致了二者的機(jī)制不同,這里就牽涉到servlet和filter的區(qū)別了。
性能:spring會稍微比struts快。spring mvc是基于方法的設(shè)計,而sturts是基于類,每次發(fā)一次請求都會實例一個action,每個action都會被注入屬性,而spring基于方法,粒度更細(xì),但要小心把握像在servlet控制數(shù)據(jù)一樣。spring3 mvc是方法級別的攔截,攔截到方法后根據(jù)參數(shù)上的注解,把request數(shù)據(jù)注入進(jìn)去,在spring3 mvc中,一個方法對應(yīng)一個request上下文。而struts2框架是類級別的攔截,每次來了請求就創(chuàng)建一個Action,然后調(diào)用setter getter方法把request中的數(shù)據(jù)注入;struts2實際上是通過setter getter方法與request打交道的;struts2中,一個Action對象對應(yīng)一個request上下文。
參數(shù)傳遞:struts是在接受參數(shù)的時候,可以用屬性來接受參數(shù),這就說明參數(shù)是讓多個方法共享的。
設(shè)計思想上:struts更加符合oop的編程思想, spring就比較謹(jǐn)慎,在servlet上擴(kuò)展。
intercepter的實現(xiàn)機(jī)制:struts有以自己的interceptor機(jī)制,spring mvc用的是獨(dú)立的AOP方式。這樣導(dǎo)致struts的配置文件量還是比spring mvc大,雖然struts的配置能繼承,所以我覺得論使用上來講,spring mvc使用更加簡潔,開發(fā)效率Spring MVC確實比struts2高。spring mvc是方法級別的攔截,一個方法對應(yīng)一個request上下文,而方法同時又跟一個url對應(yīng),所以說從架構(gòu)本身上spring3 mvc就容易實現(xiàn)restful url。struts2是類級別的攔截,一個類對應(yīng)一個request上下文;實現(xiàn)restful url要費(fèi)勁,因為struts2 action的一個方法可以對應(yīng)一個url;而其類屬性卻被所有方法共享,這也就無法用注解或其他方式標(biāo)識其所屬方法了。spring3 mvc的方法之間基本上獨(dú)立的,獨(dú)享request response數(shù)據(jù),請求數(shù)據(jù)通過參數(shù)獲取,處理結(jié)果通過ModelMap交回給框架方法之間不共享變量,而struts2搞的就比較亂,雖然方法之間也是獨(dú)立的,但其所有Action變量是共享的,這不會影響程序運(yùn)行,卻給我們編碼,讀程序時帶來麻煩。
另外,spring3 mvc的驗證也是一個亮點,支持JSR303,處理ajax的請求更是方便,只需一個注解@ResponseBody ,然后直接返回響應(yīng)文本即可。送上一段代碼:
@RequestMapping(value=“/whitelists”)public String index(ModelMap map) {Account account = accountManager.getByDigitId(SecurityContextHolder.get().getDigitId());List groupList = groupManager.findAllGroup(account.getId());map.put(“account”, account);map.put(“groupList”, groupList);return “/group/group-index”;}// @ResponseBody ajax響應(yīng),處理Ajax請求也很方便@RequestMapping(value=“/whitelist/{whiteListId}/del”)@ResponseBodypublic String delete(@PathVariable Integer whiteListId) {whiteListManager.deleteWhiteList(whiteListId);return “success”;}復(fù)制代碼轉(zhuǎn)載于:https://juejin.im/post/5ca1c58551882543fe6174e4
總結(jié)
以上是生活随笔為你收集整理的Spring、Spring MVC、Struts2、、优缺点整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯 Omi 团队发布 mps - 原生
- 下一篇: javascript全栈开发实践-web