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 による読み込み時間の織り込みを参照してください。