Spring 2.5 的全面註解支援

工程 | Juergen Hoeller | 2008 年 1 月 28 日 | ...

Spring 2.5 背後的核心主題之一是全面的基於註解的配置。我們一直在討論並撰寫大量關於 @Autowired、Spring MVC 的 @RequestMapping 以及對使用 JUnit4 或 TestNG 編寫的註解測試的新支援的部落格。@Autowired 無疑是 Spring 2.5 中最重要的註解,可用於服務元件、Web 元件、單元測試,甚至在使用 Spring 的 @Configurable 結合 AspectJ 織入時的領域物件。Spring MVC 的 @RequestMapping 同樣靈活,支援多種處理程式方法簽名變體。

今天我想把重點放在不同的方面,即 Spring 支援的廣泛的依賴注入註解集。以下列表包含了可在 Spring 2.5 bean 中使用的關鍵註解

  • org.springframework.beans.factory.annotation.Required: 標識必須被呼叫的 bean 屬性 setter(與可選的 setter 相對)。自 Spring 2.0 起支援。
  • org.springframework.beans.factory.annotation.Autowired: Spring 2.5 的核心注入註解,適用於建構函式、配置方法和欄位。按型別執行元件注入,支援“限定符”註解,以便在有多個匹配項時縮小潛在候選集的範圍。
  • javax.annotation.PostConstruct: JSR-250 的通用註解,用於 Spring 稱為“init 方法”的用途。
  • javax.annotation.PreDestroy: JSR-250 的通用註解,用於 Spring 稱為“destroy 方法”的用途。
  • javax.annotation.Resource: JSR-250 的通用註解,用於按名稱注入外部元件。在 JSR-250 術語中,“resource”實際上是指諸如 DataSource 之類的中介軟體元件。
  • javax.xml.ws.WebServiceRef: 類似於 @Resource,用於 JAX-WS 服務查詢,注入 JAX-WS 埠代理。
  • javax.ejb.EJB: 類似於 @Resource,用於 EJB Session Bean 查詢,注入 EJB 元件引用。
  • javax.persistence.PersistenceUnit: 按持久化單元名稱注入 JPA EntityManagerFactory。自 Spring 2.0 起支援。
  • javax.persistence.PersistenceContext: 按持久化單元名稱注入 JPA EntityManager。自 Spring 2.0 起支援。


這組註解包含了 Java EE 5 的所有通用註解,這意味著您可以在例如 Servlet 2.5 的 servlet、JSF 1.2 的託管 bean 和 Spring 的託管 bean 中使用相同的通用註解。換句話說,如果您有一些使用了註解的標準 JSF 1.2 託管 bean,您可以按原樣將它們的定義從 faces-config 移到 Spring 應用上下文,而無需更改 bean 類!這是一個重要的設計目標:透過簡單地選擇 SpringBeanFacesELResolver 作為您的自定義 JSF ELResolver,Spring 2.5 可以直接替代標準的 JSF 1.2 託管 bean 功能。

在配置方面,您只需在 Spring 應用上下文中使用以下簡單的配置元素即可啟用上述完整的註解集

<context:annotation-config/>

請注意,此設定僅與依賴注入相關,不需要任何引數化。(對於自定義,可以考慮定義 Spring 的獨立 AnnotationBeanPostProcessor,例如 CommonAnnotationBeanPostProcessor)。但是,annotation-config 元素啟用任何形式的代理或特殊匯出。為此,Spring 提供了更具體的配置元素

<tx:annotation-driven/>

此設定啟用事務註解的處理,Spring 2.5 開箱即用支援以下兩種變體

  • org.springframework.transaction.annotation.Transactional: Spring 自身的事務註解,自 Spring 1.2 引入。允許在事務級別指定傳播行為(REQUIRED, REQUIRES_NEW 等)、只讀標誌、自定義隔離級別(REPEATABLE_READ, SERIALIZABLE 等)以及自定義回滾規則。
  • javax.ejb.TransactionAttribute EJB 3.0 的事務註解。除了傳播行為(REQUIRED, REQUIRES_NEW 等)之外,沒有其他自定義選項。


旁註:與 Spring 的所有支援選項一樣,EJB 3.0 TransactionAttribute 註解僅在 EJB 3.0 API 實際存在於 classpath 中時可用。Spring 會自動適應該 API 的存在,類似於 JSR-250 API 或 JPA API(如上所述)。

<tx:annotation-driven> 元素允許進行事務特定配置,例如要與之通訊的 Spring PlatformTransactionManager(透過“transaction-manager”屬性)以及操作的模式

<tx:annotation-driven transaction-manager="myTm" mode="aspectj"/>

事務註解處理的顯式 AspectJ 模式是 Spring 2.5 中的新功能,允許使用 Spring 的 AnnotationTransactionAspect 代替傳統的 AOP 代理。這需要 AspectJ 編譯時織入或載入時織入,修改恰好使用了 @Transactional 註解的類的位元組碼。這種織入允許支援註解在任何型別的方法上:無論是 public、protected 還是 private,無論是外部呼叫還是物件內部的呼叫,事務都將始終按照註解的指定啟動。這與傳統的 AOP 代理形成鮮明對比,在傳統的 AOP 代理中,註解驅動的事務僅限於透過代理進入的 public 方法呼叫。

如果您的環境支援載入時織入,那麼以下配置足以啟用 AspectJ 風格的事務註解處理。請注意,這需要具有內建織入支援的執行時環境(例如 WebLogic 10、OC4J 10.1.3.1、配置了 Spring 的 TomcatInstrumentableClassLoader 的 Tomcat),或者在 JVM 啟動時指定 Spring 的 VM 代理(“-javaagent:spring-agent.jar”)。

<context:load-time-weaver/>

<tx:annotation-driven mode="aspectj"/>

<bean id="transactionManager" class="..."/>

最後,Spring 2.5 還提供了一個方便的配置元素用於啟用 JMX 匯出。在所有常見平臺上,包括標準的 Java 5 平臺 MBeanServer 以及 WebLogic 9/10 和 WebSphere 6 暴露的特殊 MBeanServer,預設的 MBeanServer 都將自動檢測到。

<context:mbean-export/>

Spring 管理的 bean 可以實現標準的 MBean/MXBean 約定,符合 JMX 規範的 MBean 類,或者使用以下註解宣告其管理簽名(自 Spring 1.2 起已知)

  • org.springframework.jmx.export.annotation.ManagedResource: 用於型別級別,表示一個透過 JMX 暴露的元件。
  • org.springframework.jmx.export.annotation.ManagedAttribute: 用於 bean 屬性 setter/getter 級別,表示一個 MBean 屬性。
  • org.springframework.jmx.export.annotation.ManagedOperation: 用於 public 方法級別,表示一個匯出的 MBean 操作。


這體現了 Spring 註解配置模型的真正強大之處:不同的配置關注點無縫地融合成一個統一的整體,具有一致的配置風格和統一的元件生命週期——歸根結底,它仍然是一個由 Spring ApplicationContext 管理的標準 Spring bean!

關於 Spring 核心配置註解的簡要介紹到此為止。如果您有興趣瞭解更多關於 Spring 2.5 的新功能以及它們如何協同工作,我邀請您參加本週三的Spring 2.5 網路研討會,我將在其中涵蓋 Spring 2.5 的所有關鍵功能領域,從 Java 6 支援到基於註解的配置!

訂閱 Spring 快訊

訂閱 Spring 快訊,保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲取支援

Tanzu Spring 在一個簡單的訂閱中提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將到來的活動

檢視 Spring 社群的所有即將到來的活動。

檢視全部