Spring2.0的發(fā)布恐怕算得上2006年Java社區的一件大事了。在Spring2.0發(fā)布附帶的文檔里面對2.0新特性做了概要的介紹,2.0的新特性是自然是我們最關(guān)注的方面:
一、Spring的XML配置引入XML Schema語(yǔ)法簡(jiǎn)化配置
在Spring1.x系列中,bean的配置文件使用DTD,沒(méi)有namespace的分隔。2.0的一個(gè)非常大的改進(jìn)是引入了XML Schema的namespace,因而可以將bean的配置文件做大幅度的簡(jiǎn)化。這些簡(jiǎn)化包括了對bean屬性的各種簡(jiǎn)化,AOP配置的簡(jiǎn)化,事務(wù)配置的簡(jiǎn)化,JNDI配置的簡(jiǎn)化等方面。當然,在簡(jiǎn)化配置的同時(shí),新的XML Schema實(shí)際上引入了更多的XML語(yǔ)法,因此使用一個(gè)支持XML Schema的XML Editor就顯得非常必要了,例如Eclipse WTP就可以提供Schema的語(yǔ)法自動(dòng)提示和校驗功能。
Spring1.x的bean配置文件逐漸復雜煩瑣化,是Spring歷來(lái)被人所垢病的主要問(wèn)題之一。在Spring2.0里面XML Schema語(yǔ)法的配置可以在相當程度上降低配置文件的復雜程度和煩瑣程度,可以視為Spring的重大改進(jìn)之一。但是我們也必須看到XML Schema并沒(méi)有從根源上面解決XML配置復雜的問(wèn)題,而只是減輕。
將所有的bean之間的依賴(lài)關(guān)系,組裝關(guān)系統統使用XML來(lái)描述,本身就會(huì )導致XML閱讀和修改一定的困難。并且用XML配置本身無(wú)法直接進(jìn)行單元測試來(lái)驗證依賴(lài)關(guān)系。因此,當bean之間關(guān)系越復雜的時(shí)候,XML配置文件本身的維護也是一個(gè)負擔。
我個(gè)人比較期待未來(lái)的Spring能夠使用腳本語(yǔ)言來(lái)編寫(xiě)和組裝bean之間的關(guān)系,這樣組裝腳本本身也是可測試的,而且腳本的描述能力要遠遠好于XML配置文件,同時(shí)編寫(xiě)和維護起來(lái)也比XML輕松。
二、提供了request和session范圍的bean
引入request scope和session scope的bean,我感覺(jué)是把雙刃劍。對于普通的Java Web框架應用來(lái)說(shuō),和Servlet容器相關(guān)的操作應該限制在Web層,對于業(yè)務(wù)層來(lái)說(shuō),不應該涉及request和session的scope,否則業(yè)務(wù)層代碼無(wú)法脫離Servlet容器進(jìn)行單元測試。對于使用Webwork/Struts框架的用戶(hù)來(lái)說(shuō),恐怕不太會(huì )使用該特性,另外根據我的理解,也許request/session scope的bean也是為了提供給Spring MVC的Controller使用的。
除此之外,對于A(yíng)JAX Web Service調用來(lái)說(shuō),這一特性反而是很有用處的。對于這種應用場(chǎng)景,JS通過(guò)AJAX調用,拋開(kāi)Web層框架,直接訪(fǎng)問(wèn)業(yè)務(wù)層bean,這個(gè)時(shí)候就需要提供request/session scope的bean了。
三、集成AspectJ,可以管理容器外對象,提供了領(lǐng)域模型的依賴(lài)注入
通常由Hibernate管理的持久化對象PO,并不是由Spring容器初始化的,往往是用戶(hù)自己new出來(lái),或者通過(guò)find,load方法創(chuàng )建的,其結果就是Spring容器無(wú)法對這種容器外創(chuàng )建的對象進(jìn)行bean依賴(lài)關(guān)系注入。
在Spring2.0中,可以使用AspectJ對領(lǐng)域模型進(jìn)行靜態(tài)織入,這樣當該領(lǐng)域模型在容器外被創(chuàng )建的時(shí)候,會(huì )產(chǎn)生對容器的回調,進(jìn)行依賴(lài)關(guān)系的注入。
Spring2.0提供的這一特性,確保了Martin Folwer的Rich Domain Object的可行性,這一特性的提供恐怕會(huì )對未來(lái)很多Java系統的設計產(chǎn)生相當深遠的影響。
其實(shí)針對Rich Domain Object更進(jìn)一步,如果將DAO功能作為Domain Object的抽象父類(lèi),那么持久化對象PO就會(huì )集PO,DAO,Service對象于一身,整個(gè)業(yè)務(wù)層,持久層完全合并為一個(gè)對象,通過(guò)這種方式進(jìn)行框架簡(jiǎn)化得到的結果就是,高度類(lèi)似于ruby on rails的full-stack的MVC框架。
四、JPA支持
這一點(diǎn)其實(shí)沒(méi)有什么可點(diǎn)評的,提供JPA支持本來(lái)就是理所應當之事。
五、JDBC的NamedParameterJdbcTemplate
NamedParameterJdbcTemplate我認為意義非凡,為JDBC查詢(xún)提供了帶命名參數的占位符,而不止是JDBC自己的“?”,這樣使用JDBC的時(shí)候,也可以很容易的構造出來(lái)帶占位符的動(dòng)態(tài)條件查詢(xún),而不是參數值帶入方式的拼接SQL字符串了。
六、Spring Web MVC功能的大幅度擴充
看的出來(lái),在Spring2.0里面 Web MVC功能大幅度擴充,過(guò)去不提供的UI Taglib也終于提供了,配置文件也進(jìn)行了必要的簡(jiǎn)化。雖然Spring MVC從框架設計角度來(lái)說(shuō)遠遠不如Webwork那么有創(chuàng )意,但是也是一步一個(gè)腳印的改進(jìn),再配合上各種外圍框架例如Spring Webflow等的支持,可以預見(jiàn)Spring MVC會(huì )成長(cháng)為Webwork的勁敵。
七、支持動(dòng)態(tài)語(yǔ)言ruby,groovy,beanshell
動(dòng)態(tài)語(yǔ)言支持目前看來(lái)還比較簡(jiǎn)單,不夠強大,但是表明了Spring的一個(gè)態(tài)度,其實(shí)我個(gè)人希望Spring能夠加強這方面支持,甚至大膽一點(diǎn),提供用動(dòng)態(tài)腳本語(yǔ)言編寫(xiě)的bean組裝配置。
八、異步JMS支持,JMX支持,JCA支持的功能完善
Spring2.0自身提供了兩類(lèi)簡(jiǎn)單的JMS Containter,此外還提供了外部JMS Server的接口,另外JMX功能的支持,JCA功能的支持都在進(jìn)一步的完善過(guò)程中。
Spring2.0在這幾個(gè)方面的功能支持不是那么引入注目,畢竟普通Java Web應用很少使用這些方面。但是Spring提供這些功能的完善支持意義卻很深遠,因為這些功能都是J2EE規范所要求提供的功能,也是傳統應用服務(wù)器廠(chǎng)商相對比Java開(kāi)源框架的傳統優(yōu)勢項目。一旦Spring2.0對這些功能提供了完善的支持,那么將傳統的Java企業(yè)應用完全遷移到Spring框架上面的技術(shù)障礙就一掃而空了。
因此Spring是一個(gè)野心很大的框架,從現在狀況來(lái)看,Spring可以說(shuō)是Java開(kāi)源框架之集大成者,從未來(lái)來(lái)看,Spring將提供J2EE廠(chǎng)商所能夠提供的所有必要的功能,最終Spring將有可能取J2EE規范而代之,成為Java企業(yè)開(kāi)發(fā)的事實(shí)平臺和事實(shí)標準。
總體來(lái)說(shuō),Spring2.0將向未來(lái)的宏大目標又邁進(jìn)了一大步。不過(guò)對于我等普通Java Web項目的開(kāi)發(fā)需求來(lái)說(shuō),2.0的新特性也沒(méi)有特別需要的。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。