AspectJ で @Transactional を使用する

AspectJ アスペクトを使用して、Spring コンテナーの外部で Spring Framework の @Transactional サポートを使用することもできます。これを行うには、最初にクラス(およびオプションでクラスのメソッド)に @Transactional アノテーションを付けてから、アプリケーションを spring-aspects.jar ファイルで定義されている org.springframework.transaction.aspectj.AnnotationTransactionAspect にリンク(ウィービング)します。また、トランザクションマネージャーを使用してアスペクトを設定する必要があります。Spring Framework の IoC コンテナーを使用して、依存性の注入を処理できます。トランザクション管理のアスペクトを構成する最も簡単な方法は、<tx:annotation-driven/> エレメントを使用し、@Transactional の使用に従って mode 属性を aspectj に指定することです。ここでは、Spring コンテナーの外部で実行されるアプリケーションに焦点を当てているため、プログラムで実行する方法を示します。

続行する前に、@Transactional を使用するAOP をそれぞれ読むことをお勧めします。

次の例は、トランザクションマネージャーを作成し、それを使用するように 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 アノテーションは、クラス内の public メソッドの実行に対するデフォルトのトランザクションセマンティクスを指定します。

クラス内のメソッドの @Transactional アノテーションは、クラスアノテーション(存在する場合)によって指定されたデフォルトのトランザクションセマンティクスをオーバーライドします。可視性に関係なく、任意のメソッドにアノテーションを付けることができます。

AnnotationTransactionAspect を使用してアプリケーションを編むには、AspectJ(AspectJ 開発ガイド (英語) を参照)を使用してアプリケーションをビルドするか、ロードタイムウィービングを使用する必要があります。AspectJ でのロード時間ウィービングの説明については、Spring Framework での AspectJ による読み込み時間の織り込みを参照してください。