EJB3.0和Spring的抉擇
EJB3.0和Spring在傳遞POJO服務(wù)時(shí)采用了完全不同的方法,這使得開(kāi)發(fā)者在實(shí)施POJO時(shí)不得不進(jìn)行艱難的選擇。
對(duì)于POJO的開(kāi)發(fā),存在著兩種框架EJB3.0和Spring,這兩個(gè)框架組件的核心設(shè)計(jì)理念是相同的:把中間件服務(wù)傳遞給松散耦合的簡(jiǎn)單舊式Java對(duì)象(POJO)。這些框架組件通過(guò)在運(yùn)行時(shí)截取執(zhí)行內(nèi)容或向POJO注入服務(wù)對(duì)象,把應(yīng)用程序服務(wù)與POJO捆綁在一起。POJO本身不關(guān)心捆綁的過(guò)程,并且對(duì)框架組件幾乎沒(méi)有依賴。其結(jié)果是,開(kāi)發(fā)者可以聚焦于業(yè)務(wù)邏輯,個(gè)人可以在沒(méi)有框架組件的情況下測(cè)試他們的POJO。此外,由于POJO不需要從框架組件中繼承或?qū)崿F(xiàn)框架組件接口,開(kāi)發(fā)者建立繼承結(jié)構(gòu)和構(gòu)建應(yīng)用程序的時(shí)候都有高度的靈活性。
但是,盡管兩者的設(shè)計(jì)理念是相同的,它們傳遞POJO服務(wù)時(shí)卻采用了完全不同的方法。
注入方式
Spring仍然是依賴XML來(lái)注入到POJO的,XML寫(xiě)起來(lái)比較麻煩,雖然流行的IDE都有圖形化的編輯界面,但還是很難操作,同時(shí)Spring使用XML來(lái)說(shuō)明配置聲明性服務(wù),也會(huì)產(chǎn)生一個(gè)冗長(zhǎng)的配置文件。這些配置文件必須在運(yùn)行時(shí)才能知道其中的錯(cuò)誤,哪怕是一個(gè)大小寫(xiě)的問(wèn)題。因此Spring目前也在考慮如何簡(jiǎn)化XML配置文件。
EJB3.0使用Annotation,這要比Spring簡(jiǎn)單明了,但其功能也受到一定的限制。Spring基于XML配置的依賴注入語(yǔ)法復(fù)雜,但功能卻非常強(qiáng)大。可以將任何一個(gè)POJO注入到另一個(gè)POJO,包括應(yīng)用程序中自定義的那些POJO。
松散耦合度與服務(wù)集成
Spring與應(yīng)用服務(wù)器采取松散耦合,作為Spring設(shè)計(jì)的核心理念,這樣增強(qiáng)了Spring的靈活性,但同時(shí)也增加了開(kāi)發(fā)的復(fù)雜度,因?yàn)槿绱艘粊?lái),開(kāi)發(fā)者就必須弄清楚Spring對(duì)應(yīng)的應(yīng)用服務(wù)器的。而事實(shí)上,這些與應(yīng)用服務(wù)器的關(guān)聯(lián)代碼對(duì)于開(kāi)發(fā)者大都是不必要的,開(kāi)發(fā)者往往只需要關(guān)系業(yè)務(wù)邏輯就可以了。使用Spring的聲明式事務(wù)服務(wù)來(lái)管理Hibernate事務(wù),必須在 XML配置文件中明確的配置Spring的事務(wù)管理器(TransactionManager)和Hibernate SessionFactory對(duì)象。
EJB3.0框架與應(yīng)用服務(wù)器結(jié)合較緊密,服務(wù)被集成封裝,隱藏在EJB接口后面。因?yàn)镋JB3.0本身就是J2EE標(biāo)準(zhǔn)的一部份,因此,它與其他J2EE服務(wù)如JCA,JMX都結(jié)合的很好。而缺點(diǎn)也正是結(jié)合太緊密,不夠靈活。
對(duì)Web框架的支持度
Spring在這方面要優(yōu)于EJB3.0,幾乎所有開(kāi)源項(xiàng)目都有這個(gè)特性——對(duì)現(xiàn)有的流行技術(shù)支持度都非常好。Spring可以靈活地集成各種Web框架和模板語(yǔ)言,另外自身也提供了相當(dāng)強(qiáng)大的Spring-MVC框架,而且可以很好的結(jié)合spring webflow,webwork,struts等。同時(shí)隨著Spring Web Services 1.0正式公布,Spring對(duì)web service開(kāi)發(fā)明顯增強(qiáng)了,這無(wú)疑使Spring愛(ài)好者開(kāi)發(fā)者更加熱衷于Spring。
EJB3.0標(biāo)準(zhǔn)集成JSF,但JSF目前并不成熟,也沒(méi)有得到預(yù)期的效果。同時(shí)EJB3.0對(duì)其他web框架支持也比較差。
開(kāi)源與標(biāo)準(zhǔn)規(guī)范
Spring框架是開(kāi)源項(xiàng)目,但不是標(biāo)準(zhǔn)的。Spring的接口配置文件描述都是私有的。雖然,Rona 聲稱Spring完全支持可以不使用Spring的特殊專有服務(wù),但是實(shí)際情況往往不是這樣的。因此,一旦使用了Spring的特殊服務(wù),那么就綁定到了 Spring框架上了。例如,如果使用它的管理服務(wù),則必須使用相應(yīng)的Spring私有的API。而且,Spring的發(fā)展完全依賴于Spring開(kāi)源項(xiàng)目,這使得它的支持力度也不夠。
EJB3.0是完全公開(kāi)的規(guī)范標(biāo)準(zhǔn),它本身是J2EE標(biāo)準(zhǔn)的一部分,因此得到了很多廠商的支持。例如,JBoss在EJB3.0剛出來(lái)時(shí),就宣布其新的版本支持EJB3.0的服務(wù)器。這樣基于EJB3.0的程序就可以比較輕松地在 WebSphere、WebLogic以及JBoss之間進(jìn)行切換(除非使用了應(yīng)用服務(wù)器提供的專有組件)。
【編輯推薦】

















