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 術語中的「資源」實際上是指中介軟體元件,例如 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 類別中不會有任何變更! 這是一個重要的設計目標:Spring 2.5 可以作為標準 JSF 1.2 受管理 bean 機制的簡單替代方案,只需選擇 SpringBeanFacesELResolver 作為您的自訂 JSF ELResolver 即可。

在配置方面,您需要做的就是啟用上述所有註解,即在您的 Spring 應用程式內容中使用以下簡單配置元素

<context:annotation-config/>

請注意,此設定僅與依賴注入相關,不需要任何參數化。 (若要進行自訂,請考慮改為定義 Spring 的個別 AnnotationBeanPostProcessors,例如 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 API 實際存在於類別路徑中時,EJB 3.0 TransactionAttribute 註解才可用。 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 註解的類別的位元組碼。 這種織入允許支援任何類型方法上的註解:無論是公開、受保護或私有 - 無論是外部呼叫還是物件內的呼叫 - 交易始終會按照註解中的指定啟動。 這與傳統的 AOP 代理形成鮮明對比,在傳統的 AOP 代理中,基於註解驅動的交易僅限於透過代理傳入的公開方法呼叫。

如果您的環境能夠進行載入時織入,則以下配置足以啟用 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 匯出。 預設的 MBeanServer 將在所有常見平台上自動偵測到,包括標準 Java 5 平台 MBeanServer 以及 WebLogic 9/10 和 WebSphere 6 公開的特殊 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: 在公開方法層級使用,以指示匯出器 MBean 運算。


這表明了 Spring 註解配置模型的真正強大之處:不同的配置考量無縫地合併到一個統一的整體中,具有一致的配置樣式和統一的元件生命週期 - 它們仍然是一個標準的 Spring bean,由 Spring ApplicationContext 管理!

關於 Spring 的核心配置註解的簡短介紹就到此為止。 如果您有興趣了解更多關於 Spring 2.5 中的新增功能以及它們如何整合在一起的資訊,請讓我邀請您參加本週三的 Spring 2.5 線上研討會,我將在其中介紹 Spring 2.5 中的所有關鍵功能領域,從 Java 6 支援到基於註解的配置!

取得 Spring 電子報

隨時關注 Spring 電子報

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進度。

了解更多

取得支援

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

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部