Hibernate、Struts和Spring優(yōu)缺點(diǎn)全析
本文重要一一向大家介紹Hibernate、Struts和Spring優(yōu)缺點(diǎn),下面給大家簡(jiǎn)單加以說明,希望對(duì)大家的學(xué)習(xí)和工作有所幫助。
1.struts
struts框架具有組件的模塊化,靈活性和重用性的優(yōu)點(diǎn),同時(shí)簡(jiǎn)化了基于MVC的web應(yīng)用程序的開發(fā)。
優(yōu)點(diǎn):
Struts跟Tomcat、Turbine等諸多Apache項(xiàng)目一樣,是開源軟件,這是它的一大優(yōu)點(diǎn)。使開發(fā)者能更深入的了解其內(nèi)部實(shí)現(xiàn)機(jī)制。
除此之外,Struts的優(yōu)點(diǎn)主要集中體現(xiàn)在兩個(gè)方面:Taglib和頁(yè)面導(dǎo)航。Taglib是Struts的標(biāo)記庫(kù),靈活動(dòng)用,能大大提高開發(fā)效率。另外,就目前國(guó)內(nèi)的JSP開發(fā)者而言,除了使用JSP自帶的常用標(biāo)記外,很少開發(fā)自己的標(biāo)記,或許Struts是一個(gè)很好的起點(diǎn)。
關(guān)于頁(yè)面導(dǎo)航,我認(rèn)為那將是今后的一個(gè)發(fā)展方向,事實(shí)上,這樣做,使系統(tǒng)的脈絡(luò)更加清晰。通過一個(gè)配置文件,即可把握整個(gè)系統(tǒng)各部分之間的聯(lián)系,這對(duì)于后期的維護(hù)有著莫大的好處。尤其是當(dāng)另一批開發(fā)者接手這個(gè)項(xiàng)目時(shí),這種優(yōu)勢(shì)體現(xiàn)得更加明顯。
另外,struts是業(yè)界"標(biāo)準(zhǔn)"(很多成功案例),學(xué)習(xí)資源豐富,HTML標(biāo)簽非常優(yōu)秀
缺點(diǎn):
Taglib是Struts的一大優(yōu)勢(shì),但對(duì)于初學(xué)者而言,卻需要一個(gè)持續(xù)學(xué)習(xí)的過程,甚至還會(huì)打亂你網(wǎng)頁(yè)編寫的習(xí)慣,但是,當(dāng)你習(xí)慣了它時(shí),你會(huì)覺得它真的很棒。
Struts將MVC的Controller一分為三,在獲得結(jié)構(gòu)更加清晰的同時(shí),也增加了系統(tǒng)的復(fù)雜度。
ActionForms使用不便、無法進(jìn)行單元測(cè)試(StrutsTestCase只能用于集成)
Struts跟Tomcat、Turbine等諸多Apache項(xiàng)目一樣,是開源軟件,這是它的一大優(yōu)點(diǎn)。使開發(fā)者能更深入的了解其內(nèi)部實(shí)現(xiàn)機(jī)制。 Struts開放源碼框架的創(chuàng)建是為了使開發(fā)者在構(gòu)建基于Java Servlet和JavaServer Pages(JSP)技術(shù)的Web應(yīng)用時(shí)更加容易。Struts框架為開放者提供了一個(gè)統(tǒng)一的標(biāo)準(zhǔn)框架,通過使用Struts作為基礎(chǔ),開發(fā)者能夠更專注于應(yīng)用程序的商業(yè)邏輯。Struts框架本身是使用Java Servlet和JavaServer Pages技術(shù)的一種Model-View-Controller(MVC)實(shí)現(xiàn).
Struts優(yōu)點(diǎn):
1. 實(shí)現(xiàn)MVC模式,結(jié)構(gòu)清晰,使開發(fā)者只關(guān)注業(yè)務(wù)邏輯的實(shí)現(xiàn).
2. 有豐富的tag可以用 ,Struts的標(biāo)記庫(kù)(Taglib),如能靈活動(dòng)用,則能大大提高開發(fā)效率。另外,就目前國(guó)內(nèi)的JSP開發(fā)者而言,除了使用JSP自帶的常用標(biāo)記外,很少開發(fā)自己的標(biāo)記,或許Struts是一個(gè)很好的起點(diǎn)。
3. 頁(yè)面導(dǎo)航.頁(yè)面導(dǎo)航將是今后的一個(gè)發(fā)展方向,事實(shí)上,這樣做,使系統(tǒng)的脈絡(luò)更加清晰。通過一個(gè)配置文件,即可把握整個(gè)系統(tǒng)各部分之間的聯(lián)系,這對(duì)于后期的維護(hù)有著莫大的好處。尤其是當(dāng)另一批開發(fā)者接手這個(gè)項(xiàng)目時(shí),這種優(yōu)勢(shì)體現(xiàn)得更加明顯。
4. 提供Exception處理機(jī)制 .
5. 數(shù)據(jù)庫(kù)鏈接池管理
6. 支持I18N
缺點(diǎn):
1、轉(zhuǎn)到展示層時(shí),需要配置forward,每一次轉(zhuǎn)到展示層,相信大多數(shù)都是直接轉(zhuǎn)到j(luò)sp,而涉及到轉(zhuǎn)向,需要配置forward,如果有十個(gè)展示層的jsp,需要配置十次struts,而且還不包括有時(shí)候目錄、文件變更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整個(gè)項(xiàng)目,而tomcate這樣的服務(wù)器,還必須重新啟動(dòng)服務(wù)器,如果業(yè)務(wù)變更復(fù)雜頻繁的系統(tǒng),這樣的操作簡(jiǎn)單不可想象?,F(xiàn)在就是這樣,幾十上百個(gè)人同時(shí)在線使用我們的系統(tǒng),大家可以想象一下,我的煩惱有多大。
2、Struts 的Action必需是thread-safe方式,它僅僅允許一個(gè)實(shí)例去處理所有的請(qǐng)求。所以action用到的所有的資源都必需統(tǒng)一同步,這個(gè)就引起了線程安全的問題。
3、測(cè)試不方便. Struts的每個(gè)Action都同Web層耦合在一起,這樣它的測(cè)試依賴于Web容器,單元測(cè)試也很難實(shí)現(xiàn)。不過有一個(gè)Junit的擴(kuò)展工具Struts TestCase可以實(shí)現(xiàn)它的單元測(cè)試。
4、類型的轉(zhuǎn)換. Struts的FormBean把所有的數(shù)據(jù)都作為String類型,它可以使用工具Commons-Beanutils進(jìn)行類型轉(zhuǎn)化。但它的轉(zhuǎn)化都是在Class級(jí)別,而且轉(zhuǎn)化的類型是不可配置的。類型轉(zhuǎn)化時(shí)的錯(cuò)誤信息返回給用戶也是非常困難的。
5、對(duì)Servlet的依賴性過強(qiáng). Struts處理Action時(shí)必需要依賴ServletRequest 和ServletResponse,所有它擺脫不了Servlet容器。
6、前端表達(dá)式語(yǔ)言方面.Struts集成了JSTL,所以它主要使用JSTL的表達(dá)式語(yǔ)言來獲取數(shù)據(jù)??墒荍STL的表達(dá)式語(yǔ)言在Collection和索引屬性方面處理顯得很弱。
7、對(duì)Action執(zhí)行的控制困難. Struts創(chuàng)建一個(gè)Action,如果想控制它的執(zhí)行順序?qū)?huì)非常困難。甚至你要重新去寫Servlet來實(shí)現(xiàn)你的這個(gè)功能需求。
8、對(duì)Action 執(zhí)行前和后的處理. Struts處理Action的時(shí)候是基于class的hierarchies,很難在action處理前和后進(jìn)行操作。
9、對(duì)事件支持不夠. 在struts中,實(shí)際是一個(gè)表單Form對(duì)應(yīng)一個(gè)Action類(或DispatchAction),換一句話說:在Struts中實(shí)際是一個(gè)表單只能對(duì)應(yīng)一個(gè)事件,struts這種事件方式稱為application event,application event和component event相比是一種粗粒度的事件。
Struts重要的表單對(duì)象ActionForm是一種對(duì)象,它代表了一種應(yīng)用,這個(gè)對(duì)象中至少包含幾個(gè)字段,這些字段是Jsp頁(yè)面表單中的input字段,因?yàn)橐粋€(gè)表單對(duì)應(yīng)一個(gè)事件,所以,當(dāng)我們需要將事件粒度細(xì)化到表單中這些字段時(shí),也就是說,一個(gè)字段對(duì)應(yīng)一個(gè)事件時(shí),單純使用Struts就不太可能,當(dāng)然通過結(jié)合JavaScript也是可以轉(zhuǎn)彎實(shí)現(xiàn)的。
2.Hibernate
Hibernate是一個(gè)開放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得Java程序員可以隨心所欲的使用對(duì)象編程思維來操縱數(shù)據(jù)庫(kù)。
Hibernate可以應(yīng)用在任何使用JDBC的場(chǎng)合,既可以在Java的客戶端程序?qū)嵱?,也可以在Servlet/JSP的Web應(yīng)用中使用,最具革命意義的是,Hibernate可以在應(yīng)用EJB的J2EE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任。
大多數(shù)開發(fā)機(jī)構(gòu)經(jīng)常采取創(chuàng)建各自獨(dú)立的數(shù)據(jù)持久層。一旦底層的數(shù)據(jù)結(jié)構(gòu)發(fā)生改變,那么修改應(yīng)用的其余部分使之適應(yīng)這種改變的代價(jià)將是十分巨大的。Hibernate適時(shí)的填補(bǔ)了這一空白,它為Java應(yīng)用提供了一個(gè)易用的、高效率的對(duì)象關(guān)系映射框架。hibernate是個(gè)輕量級(jí)的持久性框架,功能卻非常豐富。
優(yōu)點(diǎn):
1.Hibernate 使用 Java 反射機(jī)制 而不是字節(jié)碼增強(qiáng)程序來實(shí)現(xiàn)透明性。
2.Hibernate 的性能非常好,因?yàn)樗莻€(gè)輕量級(jí)框架。 映射的靈活性很出色。
3.它支持各種關(guān)系數(shù)據(jù)庫(kù),從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。
缺點(diǎn):它限制您所使用的對(duì)象模型。(例如,一個(gè)持久性類不能映射到多個(gè)表)其獨(dú)有的界面和可憐的市場(chǎng)份額也讓人不安,盡管如此,Hibernate 還是以其強(qiáng)大的發(fā)展動(dòng)力減輕了這些風(fēng)險(xiǎn)。其他的開源持久性框架也有一些,不過都沒有 Hibernate 這樣有市場(chǎng)沖擊力。
上面回貼情緒有點(diǎn)激動(dòng),希望諒解,我不是因?yàn)橛腥伺u(píng)Hibernate而感到不快,而是因?yàn)樘永锩娴挠^點(diǎn)實(shí)在讓我覺得荒謬。不管覺得Hibernate好也吧,不好也吧,我唯一覺得遺憾的是,在中文論壇里面找不到一個(gè)對(duì)Hibernate的真正高水平的評(píng)價(jià)。在TSS上有一個(gè)關(guān)于Hibernate的hot thread,跟了幾百貼,其中包括Hibernate作者Gavin和LiDO JDO的CTO,對(duì)于JDO和Hibernate有過一些激烈的爭(zhēng)論,我曾經(jīng)耐心的看了一遍,仍然沒有發(fā)現(xiàn)針對(duì)Hibernate真正有力的攻擊,那些所謂的攻擊無非針對(duì)Hibernate沒有一個(gè)GUI的配置工具,沒有商業(yè)公司支持,沒有標(biāo)準(zhǔn)化等等這些站不住腳的理由。
補(bǔ)充幾點(diǎn)我的意見:
1、Hibernate是JDBC的輕量級(jí)的對(duì)象封裝,它是一個(gè)獨(dú)立的對(duì)象持久層框架,和App Server,和EJB沒有什么必然的聯(lián)系。Hibernate可以用在任何JDBC可以使用的場(chǎng)合,例如Java應(yīng)用程序的數(shù)據(jù)庫(kù)訪問代碼,DAO接口的實(shí)現(xiàn)類,甚至可以是BMP里面的訪問數(shù)據(jù)庫(kù)的代碼。從這個(gè)意義上來說,Hibernate和EB不是一個(gè)范疇的東西,也不存在非此即彼的關(guān)系。
2、Hibernate是一個(gè)和JDBC密切關(guān)聯(lián)的框架,所以Hibernate的兼容性和JDBC驅(qū)動(dòng),和數(shù)據(jù)庫(kù)都有一定的關(guān)系,但是和使用它的Java程序,和App Server沒有任何關(guān)系,也不存在兼容性問題。
3、Hibernate不能用來直接和Entity Bean做對(duì)比,只有放在整個(gè)J2EE項(xiàng)目的框架中才能比較。并且即使是放在軟件整體框架中來看,Hibernate也是做為JDBC的替代者出現(xiàn)的,而不是Entity Bean的替代者出現(xiàn)的,讓我再列一次我已經(jīng)列n次的框架結(jié)構(gòu):
傳統(tǒng)的架構(gòu):
1) Session Bean <-> Entity Bean <-> DB
為了解決性能障礙的替代架構(gòu):
2) Session Bean <-> DAO <-> JDBC <-> DB
使用Hibernate來提高上面架構(gòu)的開發(fā)效率的架構(gòu):
3) Session Bean <-> DAO <-> Hibernate <-> DB
就上面3個(gè)架構(gòu)來分析:
1、內(nèi)存消耗:采用JDBC的架構(gòu)2無疑是最省內(nèi)存的,Hibernate的架構(gòu)3次之,EB的架構(gòu)1最差。
2、運(yùn)行效率:如果JDBC的代碼寫的非常優(yōu)化,那么JDBC架構(gòu)運(yùn)行效率最高,但是實(shí)際項(xiàng)目中,這一點(diǎn)幾乎做不到,這需要程序員非常精通JDBC,運(yùn)用Batch語(yǔ)句,調(diào)整PreapredStatement的Batch Size和Fetch Size等參數(shù),以及在必要的情況下采用結(jié)果集cache等等。而一般情況下程序員是做不到這一點(diǎn)的。因此Hibernate架構(gòu)表現(xiàn)出最快的運(yùn)行效率。EB的架構(gòu)效率會(huì)差的很遠(yuǎn)。
3、開發(fā)效率:在有JBuilder的支持下以及簡(jiǎn)單的項(xiàng)目,EB架構(gòu)開發(fā)效率最高,JDBC次之,Hibernate最差。但是在大的項(xiàng)目,特別是持久層關(guān)系映射很復(fù)雜的情況下,Hibernate效率高的驚人,JDBC次之,而EB架構(gòu)很可能會(huì)失敗。
4、分布式,安全檢查,集群,負(fù)載均衡的支持
由于有SB做為Facade,3個(gè)架構(gòu)沒有區(qū)別。
EB和Hibernate學(xué)習(xí)難度在哪里?EB的難度在哪里?不在復(fù)雜的XML配置文件上,而在于EB運(yùn)用稍微不慎,就有嚴(yán)重的性能障礙。所以難在你需要學(xué)習(xí)很多EJB設(shè)計(jì)模式來避開性能問題,需要學(xué)習(xí)App Server和EB的配置來優(yōu)化EB的運(yùn)行效率。做EB的開發(fā)工作,程序員的大部分精力都被放到了EB的性能問題上了,反而沒有更多的精力關(guān)注本身就主要投入精力去考慮的對(duì)象持久層的設(shè)計(jì)上來。
Hibernate難在哪里?不在Hibernate本身的復(fù)雜,實(shí)際上Hibernate非常的簡(jiǎn)單,難在Hibernate太靈活了。
當(dāng)你用EB來實(shí)現(xiàn)持久層的時(shí)候,你會(huì)發(fā)現(xiàn)EB實(shí)在是太笨拙了,笨拙到你根本沒有什么可以選擇的余地,所以你根本就不用花費(fèi)精力去設(shè)計(jì)方案,去平衡方案的好壞,去費(fèi)腦筋考慮選擇哪個(gè)方案,因?yàn)橹挥形ㄒ坏姆桨笖[在你面前,你只能這么做,沒得選擇。
Hibernate相反,它太靈活了,相同的問題,你至少可以設(shè)計(jì)出十幾種方案來解決,所以特別的犯難,究竟用這個(gè),還是用那個(gè)呢?這些方案之間到底有什么區(qū)別呢?他們的運(yùn)行原理有什么不同?運(yùn)行效率哪個(gè)比較好?光是主鍵生成,就有七八種方案供你選擇,你為難不為難?集合屬性可以用Set,可以用List,還可以用Bag,到底哪個(gè)效率高,你為難不為難?查詢可以用iterator,可以用list,哪個(gè)好,有什么區(qū)別?你為難不為難?復(fù)合主鍵你可以直接在hbm里面配置,也可以自定義CustomerType,哪種比較好些?你為難不為難?對(duì)于一個(gè)表,你可以選擇單一映射一個(gè)對(duì)象,也可以映射成父子對(duì)象,還可以映射成兩個(gè)1:1的對(duì)象,在什么情況下用哪種方案比較好,你為難不為難?
這個(gè)列表可以一直開列下去,直到你不想再看下去為止。當(dāng)你面前擺著無數(shù)的眼花繚亂的方案的時(shí)候,你會(huì)覺得幸福呢?還是悲哀呢?如果你是一個(gè)負(fù)責(zé)的程序員,那么你一定會(huì)仔細(xì)研究每種方案的區(qū)別,每種方案的效率,每種方案的適用場(chǎng)合,你會(huì)覺得你已經(jīng)陷入進(jìn)去拔不出來了。如果是用EB,你第一秒種就已經(jīng)做出了決定,根本沒得選擇,比如說集合屬性,你只能用Collection,如果是Hibernate,你會(huì)在Bag,List和Set之間來回猶豫不決,甚至搞不清楚的話,程序都沒有辦法寫。
3. Spring
它是一個(gè)開源的項(xiàng)目,而且目前非?;钴S;它基于IoC(Inversion of Control,反向控制)和AOP的構(gòu)架多層j2ee系統(tǒng)的框架,但它不強(qiáng)迫你必須在每一層 中必須使用Spring,因?yàn)樗K化的很好,允許你根據(jù)自己的需要選擇使用它的某一個(gè)模塊;它實(shí)現(xiàn)了很優(yōu)雅的MVC,對(duì)不同的數(shù)據(jù)訪問技術(shù)提供了統(tǒng)一的 接口,采用IoC使得可以很容易的實(shí)現(xiàn)bean的裝配,提供了簡(jiǎn)潔的AOP并據(jù)此實(shí)現(xiàn)Transcation Managment,等等
優(yōu)點(diǎn):
1. Spring能有效地組織你的中間層對(duì)象,不管你是否選擇使用了EJB。如果你僅僅使用了Struts或其他為J2EE的 API特制的framework,Spring致力于解決剩下的問題。
2. Spring能消除在許多工程中常見的對(duì)Singleton的過多使用。根據(jù)我的經(jīng)驗(yàn),這是一個(gè)很大的問題,它降低了系統(tǒng)的可測(cè)試性和面向?qū)ο蟮某潭取?
3. 通過一種在不同應(yīng)用程序和項(xiàng)目間一致的方法來處理配置文件,Spring能消除各種各樣自定義格式的屬性文件的需要。曾經(jīng)對(duì)某個(gè)類要尋找的是哪個(gè)魔法般的屬性項(xiàng)或系統(tǒng)屬性感到不解,為此不得不去讀Javadoc甚至源編碼?有了Spring,你僅僅需要看看類的JavaBean屬性。Inversion of Control的使用(在下面討論)幫助完成了這種簡(jiǎn)化。
4.通過把對(duì)接口編程而不是對(duì)類編程的代價(jià)幾乎減少到?jīng)]有,Spring能夠促進(jìn)養(yǎng)成好的編程習(xí)慣。
5. Spring被設(shè)計(jì)為讓使用它創(chuàng)建的應(yīng)用盡可能少的依賴于他的APIs。在Spring應(yīng)用中的大多數(shù)業(yè)務(wù)對(duì)象沒有依賴于Spring。
6. 使用Spring構(gòu)建的應(yīng)用程序易于單元測(cè)試。
7. Spring能使EJB的使用成為一個(gè)實(shí)現(xiàn)選擇,而不是應(yīng)用架構(gòu)的必然選擇。你能選擇用POJOs或local EJBs來實(shí)現(xiàn)業(yè)務(wù)接口,卻不會(huì)影響調(diào)用代碼。
8. Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適用于許多web應(yīng)用。例如,Spring能使用AOP提供聲明性事務(wù)管理而不通過EJB容器,如果你僅僅需要與單個(gè)數(shù)據(jù)庫(kù)打交道,甚至不需要一個(gè)JTA實(shí)現(xiàn)。
9. Spring為數(shù)據(jù)存取提供了一個(gè)一致的框架,不論是使用的是JDBC還是O/R mapping產(chǎn)品(如Hibernate)。
Spring確實(shí)使你能通過最簡(jiǎn)單可行的解決辦法來解決你的問題。而這是有有很大價(jià)值的。
缺點(diǎn):
使用人數(shù)不多、jsp中要寫很多代碼、控制器過于靈活,缺少一個(gè)公用控制器
【編輯推薦】