搭配 AspectJ 使用 @Transactional

您也可以藉由 AspectJ 切面在 Spring 容器外部使用 Spring Framework 的 @Transactional 支援。若要這麼做,請先使用 @Transactional 註解您的類別 (以及選擇性地註解您類別的方法),然後將您的應用程式與 spring-aspects.jar 檔案中定義的 org.springframework.transaction.aspectj.AnnotationTransactionAspect 連結 (編織)。您也必須使用交易管理器組態切面。您可以使用 Spring Framework 的 IoC 容器來處理相依性注入切面。組態交易管理切面最簡單的方式是使用 <tx:annotation-driven/> 元素,並將 mode 屬性指定為 aspectj,如使用 @Transactional中所述。由於我們在此處著重於在 Spring 容器外部執行的應用程式,因此我們向您展示如何以程式化方式執行此操作。

在繼續之前,您可能想要分別閱讀使用 @TransactionalAOP

以下範例示範如何建立交易管理器並組態 AnnotationTransactionAspect 以使用它

  • Java

  • Kotlin

// construct an appropriate transaction manager
DataSourceTransactionManager txManager = new DataSourceTransactionManager(getDataSource());

// configure the AnnotationTransactionAspect to use it; this must be done before executing any transactional methods
AnnotationTransactionAspect.aspectOf().setTransactionManager(txManager);
// construct an appropriate transaction manager
val txManager = DataSourceTransactionManager(getDataSource())

// configure the AnnotationTransactionAspect to use it; this must be done before executing any transactional methods
AnnotationTransactionAspect.aspectOf().transactionManager = txManager
當您使用此切面時,您必須註解實作類別 (或該類別中的方法或兩者),而不是類別實作的介面 (如果有的話)。AspectJ 遵循 Java 的規則,即介面上的註解不會被繼承。

類別上的 @Transactional 註解指定類別中任何公用方法執行的預設交易語意。

類別內方法上的 @Transactional 註解會覆寫類別註解 (如果存在) 給定的預設交易語意。您可以註解任何方法,無論可見性為何。

若要使用 AnnotationTransactionAspect 編織您的應用程式,您必須使用 AspectJ 建置您的應用程式 (請參閱AspectJ 開發指南) 或使用載入時編織。請參閱Spring Framework 中搭配 AspectJ 的載入時編織,以取得關於搭配 AspectJ 的載入時編織的討論。