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 weaving 時也可以用於領域物件。Spring MVC 的 **@RequestMapping** 也同樣靈活,支援多種 handler 方法簽名變體。

今天我想換個重點,namely,介紹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的核心注入註解,應用於建構函式、配置方法和欄位。透過型別執行元件注入,支援“qualifier”註解,可在有多個匹配項時縮小候選集。
  • javax.annotation.PostConstruct:JSR-250中用於Spring稱為“init methods”的通用註解。
  • javax.annotation.PreDestroy:JSR-250中用於Spring稱為“destroy methods”的通用註解。
  • javax.annotation.Resource:JSR-250中用於按名稱注入外部元件的通用註解。“resource”在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 servlets、JSF 1.2 managed beans和Spring managed beans中使用相同的通用註解。換句話說,如果您有一些使用註解的標準的JSF 1.2 managed beans,您可以直接將它們從faces-config移動到Spring應用程式上下文中,而無需更改bean類!這是一個重要的設計目標:Spring 2.5可以透過選擇SpringBeanFacesELResolver作為自定義JSF ELResolver,直接替換標準的JSF 1.2 managed bean功能。

在配置方面,您需要的所有操作,以啟用上述完整的註解集,是在您的Spring應用程式上下文中新增以下簡單的配置元素:

<context:annotation-config/>

請注意,此設定僅與依賴注入相關,不需要任何引數化。(如需自定義,請考慮定義Spring的individual 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 TransactionAttribute註解僅在EJB 3.0 API實際存在於類路徑中時才可用。Spring會自動適應該API的存在,類似於JSR-250 API或JPA API(如上所述)。

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

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

Spring 2.5中新增的顯式AspectJ模式事務註解處理,允許使用Spring的AnnotationTransactionAspect而不是傳統的AOP代理。這需要AspectJ編譯時織入或載入時織入,修改恰好使用@Transactional註解的類的位元組碼。這種織入允許註解在任何型別的方法上生效:無論是public、protected還是private——無論是外部呼叫還是物件內部的呼叫——事務都會按照註解的指定進行。這與傳統的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匯出。預設的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:在public方法級別使用,表示一個匯出器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 社群所有即將舉行的活動。

檢視所有