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