天天看點

Spring 2.0 的新特性

www.javabc.com

Chapter 2. Spring 2.0 的新特性

2.1. 簡介

如果你已經用了一段時間Spring Framework,那你将發現Spring正在經曆着一場大的修訂。

JDK支援

Spring Framework繼續保持與從Java 1.3開始的(包括1.3)所有Java版本的相容性。 這意味着它支援1.3、1.4和1.5,盡管Spring Framework的一些進階功能無法在1.3中使用。

修訂版引入一些新特性,總結并改進了許多現有功能。實際上,Spring得到了大量有價值的更新,以至于Spring開發團隊決定在Spring的下一個版本裡修改版本号; 是以2005年12月,在佛羅裡達召開的Spring經驗交流會上,Spring 2.0 問世了。

本章是對Spring 2.0新特性與改進特性的向導。我們希望提供一個高層的概述使那些有經驗的Spring架構師與開發人員能很快熟悉Spring 2.0的新功能。 如果想了解關于特性更多更深層的資訊,請參考在本章裡超連結的相應部分。

下面介紹的一些新的或者改進的功能已經(或将要)被加入Spring 1.2.x中。 如果想知道某功能是否被加入1.2.x版本中,請參考1.2.x釋出包的changelog。

2.2. 控制反轉(IoC)容器

Spring 2.0 相當大的改進之一就是Spring的IoC容器。

2.2.1. 更簡單的XML配置

多虧了新的基于XML Schema的XML配置文法的産生,Spring的XML配置變的更加簡單了。如果你想充分利用Spring提供的新标簽(Spring團隊當然建議你這麼做,因為他們使配置變的不再繁瑣,更加易于閱讀),請閱讀标題為 Appendix A, XML Schema-based configuration 的部分。

相關提示,請引用新的Spring 2.0 DTD以使用基于XML Schema的配置。下面給出了DOCTYPE聲明,如果有興趣的讀者可以詳細閱讀Spring 2.0釋出包的 'dist/resources'目錄中的'spring-beans-2.0.dtd' DTD。

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
			  "http://www.springframework.org/dtd/spring-beans-2.0.dtd">      

2.2.2. 新的bean作用域

Spring上個版本的IoC容器支援兩個不同的bean作用域(單例與原型)。Spring 2.0改進了這一點,不僅提供了一些依賴于Spring部署環境(比如說,在web環境中的request和session作用域bean)的額外的作用域,而且提供了所謂的'鈎子'('hooks')(因為找不到更好的表達)使Spring使用者可以創造自己的作用域。

應該注意的是,即使單例與原型作用域beans的基本(内在)實作發生了變化,上述變化對最終使用者來說是透明的...現有的配置不需要改變或放棄。

在标題為 Section 3.4, “bean的作用域” 的部分有對新增的作用域與原有作用域的較長的描述。

2.2.3. 可擴充的XML編寫

XML配置不僅更加易于書寫,而且也具有可擴充性。

這裡'可擴充性'的含義是,作為一個應用程式開發人員,或着(更可能)作為第三方架構或産品的供應商,可以開發自定義标簽,供其他開發人員把這些标簽嵌入到自己的Spring配置檔案裡。你可以在元件的特定配置中定義你自己的DSL(domain specific language,這個詞在這裡用得比較寬泛)。

對于個别應用的開發人員或者在項目中運用Spring的企業架構師來說,實作自定義Spring标簽可能不是他們的興趣所在。我們期待着第三方供應商能夠對開發在Spring配置檔案裡使用的自定義配置标簽予于足夠的關注。

可擴充的配置機制在 Appendix B, Extensible XML authoring 裡有更充分的描述。

2.3. 面向切面程式設計(AOP)

Spring 2.0在AOP上有很大的改進。Spring AOP架構本身就十分易于用XML配置,不再那麼繁瑣;Spring 2.0內建了AspectJ 切入點(pointcut)語言和 @AspectJ 切面(aspect)聲明類型。 标題為 Chapter 6, 使用Spring進行面向切面程式設計(AOP) 的部分專門描述這個新支援。

2.3.1. 更加簡單的AOP XML配置

Spring 2.0引入了新的模式,支援定義從正常Java對象中發展中來的切面。 此支援充分利用了AspectJ切入點語言,提供了完整類型的通知(advice)(也就是沒有多餘轉換和 Object[] 參數操作)。 标題為 Section 6.3, “Schema-based AOP support” 的部分較長的描述了該支援的細節。

2.3.2. 對@AspectJ 切面的支援

Spring 2.0也支援使用@AspectJ注解定義的切面。這些切面可以在AspectJ與Spring AOP中共享,僅僅需要(老實說!)一些簡單的配置。 在标題為 Section 6.2, “@AspectJ支援” 的部分讨論了對@AspectJ切面的支援。

2.4. 中間層

2.4.1. 在XML裡更為簡單的聲明性事務配置

Spring 2.0關于事務的配置方式發生了重大的變化。早先的1.2.x版本的配置方式仍然有效(并且受支援),但是新的方式明顯更加簡潔,并成為最推薦的方式。 Spring 2.0 同時提供了AspectJ切面庫,你可以使用它來生成更漂亮的事務性對象 - 甚至可以不是由Spring IoC容器産生的。

标題為 Chapter 9, 事務管理 的部分包含所有的細節。

2.4.2. JPA

Spring 2.0提供了JPA抽象層,在所起的作用與正常使用模式上,類似于Spring的JDBC抽象層。

如果你對使用實作JPA作為自己持久層的基礎感興趣,标題為 Section 12.6, “JPA” 的部分專門描述了在這個領域Spring的支援與附加值。

2.4.3. 異步的JMS

在Spring 2.0之前,Spring的JMS的作用局限于發送消息和同步接收消息。 這個功能(封裝在 JmsTemplate 類中)當然是很好的, 但是,它沒有滿足異步消息接收的需要。

Spring 2.0現在提供對異步消息接收的完整支援。在标題為 Section 19.4.2, “異步接收 - 消息驅動的POJOs” 的部分有詳細的描述。

2.4.4. JDBC

在Spring的JDBC支援庫中,有幾個小的(但同樣值得注意的)新類。首先,NamedParameterJdbcTemplate, 提供了在編寫JDBC語句時,對使用命名參數(與之相對的是編寫JDBC語句時隻使用正常的占位符('?'))的支援。

另一個新類,SimpleJdbcTemplate, 緻力于在使用Java 5+ (Tiger)開發時更加簡單地使用JdbcTemplate。

2.5. Web層

在Spring 2.0裡,web層支援得到了 充分地 改進和擴充。

2.5.1. Spring MVC的表單标簽庫

Spring MVC豐富的JSP标簽庫 來自 JIRA,其中的絕大部分是Spring使用者(範圍很廣的使用者)通過投票方式産生的。

Spring 2.0擁有一個豐富的JSP标簽庫,在使用Spring MVC時,編寫JSP頁面變得更加簡單;Spring團隊自信地認為它将滿足所有在JIRA上投票的開發人員的需要。在标題為 Section 13.9, “使用Spring的表單标簽庫” 的部分描述了新的标簽庫,标題為 Appendix E, spring-form.tld 的附錄部分是對所有新标簽的快速指南。

2.5.2. Spring MVC合理的預設值

對于很多項目而言,遵守建立好的規範,使用合理的預設值,是項目所必須的... 現在在SpringMVC裡,慣例優先(convention-over-configuration)的觀點有了明确的支援。 這就意味着當你為控制器和視圖建立一系列的命名規範時,你可以 充分 減少XML配置的數量,包括設定處理映射、視圖解析、ModelAndView的執行個體等等。 對于開發快速原型來說,這有非常大的優勢,并且越過代碼庫可以産生一定的連續性(通常是良好的)。

在标題為 Section 13.11, “慣例優先原則(convention over configuration)” 的部分,可以發現對Spring MVC的慣例優先支援的詳細内容。

2.5.3. Portlet 架構

Spring 2.0 設計了一種概念上類似于Spring MVC架構的Porlet架構。标題為 Chapter 16, Portlet MVC架構 的部分可以找到詳細的介紹。

2.6. 其他特性

最後部分羅列了所有其他關于Spring 2.0的新特性與改進特性。

2.6.1. 動态語言支援

Spring 2.0現在支援用非Java語言編寫的bean,目前支援的動态語言包括JRuby,Groovy和BeanShell。标題為 Chapter 24, 動态語言支援 部分描述了動态語言支援的細節。

2.6.2. JMX

Spring Framework開始支援通知(Notification); 還可以聲明式地控制MBean在一個MBeanServer上的注冊行為。

  • Section 20.7, “通知”
  • Section 20.2.5, “控制注冊行為”

2.6.3. 任務規劃

關于任務規劃,Spring 2.0 提供了一種抽象。對于感興趣的開發人員,标題為 Section 23.4, “SpringTaskExecutor抽象” 的部分提供了所有的細節。

2.6.4. 對Java 5(Tiger)的支援

如果你有幸使用Java 5(Tiger)進行項目開發,你将很高興地發現,Spring 2.0對于Tiger有一些非常引人注目的支援。下面是一系列Spring Java 5 獨有特性的指南

  • Section 9.5.8, “結合AspectJ使用 @Transactional”
  • Section 6.8.1, “在Spring中使用AspectJ來為domain object進行依賴注入”
  • Section 6.2, “@AspectJ支援”
  • Section 25.3.1, “@Required”
  • Section 11.2.3, “SimpleJdbcTemplate類”

2.7. 移植到Spring 2.0

最後一節中詳細說明了從Spring 1.2.x移植到Spring 2.0的過程中可能出現的問題。

先讓我們來有所保留地看看下面這句話, 從Spring 1.2移植到Spring 2.0應該就是簡單地把Spring 2.0的jar檔案放進應用程式目錄中的合适位置。

上一句話的關鍵字理所當然是“應該”。 到底是不是無縫更新依賴于你的代碼中究竟用了多少Spring API。 Spring 2.0移除了很多在Spring 1.2.x代碼庫中标為deprecated的代碼,是以如果你用了這些類或方法, 你應該使用它們的替代類或方法(下面總結了些)。

關于配置,Spring 1.2.x風格的XML配置與Spring 2.0完全相容。你仍然可以繼續使用Spring 1.2.x DTD, 不過這樣你就不能充分利用一些Spring 2.0的新功能(例如作用域、 更易用的AOP 和 事務配置), 但絕對不會有問題。

建議的移植政策是放入Spring 2.0的jar檔案以便能使用改進過的代碼(修正bug、優化等等)。 然後增量地開始嘗試Spring 2.0的新特性和配置。例如,你可以選擇先在切面配置上運用Spring 2.0風格作為開始; 90%的舊式Spring 1.2.x配置(引用1.2.x DTD)加上10%的Spring 2.0配置(引用2.0 DTD和XSD)是完全有效的。要記住, 在使用Spring 2.0庫的同時并非一定要更新XML配置。

2.7.1. 一些變化

如需了解全部變化,請參考Spring Framework 2.0釋出包頂層目錄裡的'changelog.txt'檔案。

2.7.1.1. Jar包

1.2.x和2.0的Spring Framework jar檔案有很多不同之處。 特别是現在JDO、Hibernate 2/3、TopLink的ORM內建類有專門的jar檔案:它們不再被打包在核心檔案 'spring.jar'中了。

2.7.1.2. XML配置

Spring 2.0的XSD在描述Spring XML中繼資料格式方面比先前的DTD更豐富。 舊的DTD仍然得到支援,但如果可能我們鼓勵在bean定義檔案頭部引用XSD檔案。

有一點被改變了,那就是定義bean作用域的方式。如果你使用的是Spring 1.2 DTD,那麼你能繼續用'singleton'屬性。 如果你選擇引用新的Spring 2.0 DTD,它不允許使用'singleton'屬性, 那麼可以用'scope'屬性來定義bean的生命周期作用域。

2.7.1.3. Deprecated的類和方法

一些以前被标記為@deprecated的類和方法Spring 2.0代碼庫中被完全删除了。 Spring團隊決定把2.0版本作為一個新的開始,那些被deprecated的代碼應該被除去而不是在可預見的未來繼續在代碼中出現。

就如前面所說的,如需了解全部變化,請參考Spring Framework 2.0釋出包頂層目錄裡的'changelog.txt'檔案。

下面的類/接口已經從Spring 2.0的代碼中删除了。

  • ResultReader : 使用RowMapper接口代替。
  • BeanReferenceFactoryBean : 使用别名機制代替
  • BeanDefinitionRegistryBuilder : 使用BeanDefinitionReaderUtils類上的方法代替
  • BeanFactoryBootstrap : 考慮使用一個BeanFactoryLocator 或是自定義引導類代替
  • RequestUtils : 使用ServletRequestUtils代替

2.7.1.4. Apache OJB

請注意Spring主代碼中的Apache OJB支援被完全删除了; 但仍然可以在Spring Modules項目中找到Apache OJB的內建庫。

2.7.1.5. iBatis

請注意iBATIS SQL Maps 1.3支援被完全去除了。如果你還在使用iBATIS SQL Maps 1.3, 請更新到iBATIS SQL Maps 2.0/2.1。

2.8. 更新的樣例應用

我們同樣更新了一些樣例應用以反映Spring 2.0的新特性與改進特性,請抽出時間仔細研究。 上述樣例放在Spring完整發行版裡的'samples'路徑下 ('spring-with-dependecies.[zip|tar.gz]')。

上述發行版同時提供了一些所謂的展現特性優勢的應用。每個應用都提供了完整的例子,一次示範一個Spring 2.0的新特性。 這意味着你可以在這些應用中運作代碼,而不需再自己建立小工程測試Spring 2.0的新特性。我們故意将這些應用的作用域設定的很小; 作用域模型(如果有的話)可能隻有一兩個類,而典型的企業關注點,如安全和事務完整性,顯然沒有包含在内。

2.9. 改進的文檔

Spring參考文檔理所當然的進行了充分的更新,以反映上述Spring 2.0的新特性。

盡管我們竭盡所能立争這份文檔不會出現錯誤,但是人非聖賢,錯誤在所難免。 如果您發現了一些列印排版或者更嚴重的錯誤,并可以抽出一些空閑時間來的話, 請通過 問題送出 把錯誤發給Spring團隊。

特别感謝Arthur Loder,謝謝他不辭辛勞地校對Spring Framework的參考文檔和Javadocs。