@TargetSE(valueSE=TYPESE) @RetentionSE(valueSE=RUNTIMESE) @DocumentedSE @Import(value=TransactionManagementConfigurationSelector.class) public @interface EnableTransactionManagement
<tx:*>
XML 名前空間にあるサポートと同様に、Spring のアノテーション駆動型トランザクション管理機能を有効にします。次のように @Configuration
クラスで使用されます。@Configuration @EnableTransactionManagement public class AppConfig { @Bean public FooRepository fooRepository() { // configure and return a class having @Transactional methods return new JdbcFooRepository(dataSource()); } @Bean public DataSource dataSource() { // configure and return the necessary JDBC DataSource } @Bean public PlatformTransactionManager txManager() { return new DataSourceTransactionManager(dataSource()); } }
参考のために、上記の例を次の Spring XML 構成と比較できます。
<beans> <tx:annotation-driven/> <bean id="fooRepository" class="com.foo.JdbcFooRepository"> <constructor-arg ref="dataSource"/> </bean> <bean id="dataSource" class="com.vendor.VendorDataSource"/> <bean id="transactionManager" class="org.sfwk...DataSourceTransactionManager"> <constructor-arg ref="dataSource"/> </bean> </beans>上記の両方のシナリオで、
@EnableTransactionManagement
および <tx:annotation-driven/>
は、TransactionInterceptor および JdbcFooRepository
の @Transactional
メソッドが呼び出されたときにインターセプターを呼び出しスタックに織り込むプロキシまたは AspectJ ベースのアドバイスなど、アノテーション駆動型のトランザクション管理を強化する必要な Spring コンポーネントの登録を担当します。2 つの例のわずかな違いは、PlatformTransactionManager
Bean の名前付けにあります。@Bean
の場合、名前は "txManager" (メソッド名による) で、XML の場合、名前は "transactionManager" です。<tx:annotation-driven/>
は、デフォルトで "transactionManager" という名前の Bean を検索するようにハードワイヤードされていますが、@EnableTransactionManagement
はより柔軟で、コンテナー内の任意の PlatformTransactionManager
Bean に対して型別の検索にフォールバックします。名前は "txManager"、"transactionManager"、"tm" のいずれでもかまいません。
@EnableTransactionManagement
と使用する正確なトランザクションマネージャー Bean とのより直接的な関連を確立したい場合は、TransactionManagementConfigurer
コールバックインターフェースを実装できます。以下の implements
句と @Override
アノテーション付きメソッドに注意してください。
@Configuration @EnableTransactionManagement public class AppConfig implements TransactionManagementConfigurer { @Bean public FooRepository fooRepository() { // configure and return a class having @Transactional methods return new JdbcFooRepository(dataSource()); } @Bean public DataSource dataSource() { // configure and return the necessary JDBC DataSource } @Bean public PlatformTransactionManager txManager() { return new DataSourceTransactionManager(dataSource()); } @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return txManager(); } }このアプローチは、より明示的であるという理由だけで望ましい場合があります。または、同じコンテナーに存在する 2 つの
PlatformTransactionManager
Bean を区別するために必要な場合があります。名前が示すように、annotationDrivenTransactionManager()
は @Transactional
メソッドの処理に使用されるものになります。詳細については、TransactionManagementConfigurer
Javadoc を参照してください。mode()
属性は、アドバイスの適用方法を制御します。モードが AdviceMode.PROXY
(デフォルト)の場合、他の属性がプロキシの動作を制御します。プロキシモードでは、プロキシを介した呼び出しのみのインターセプトが許可されることに注意してください。同じクラス内のローカル呼び出しは、そのようにインターセプトすることはできません。
mode() が AdviceMode.ASPECTJ
に設定されている場合、proxyTargetClass()
属性の値は無視されることに注意してください。また、この場合、影響を受けるクラスにアスペクトを適用するコンパイル時ウィービングまたはロード時ウィービングを使用して、spring-aspects
モジュール JAR がクラスパスに存在する必要があることに注意してください。このようなシナリオに関係するプロキシはありません。ローカルコールもインターセプトされます。
TransactionManagementConfigurer
, TransactionManagementConfigurationSelector
, ProxyTransactionManagementConfiguration
, AspectJTransactionManagementConfiguration
修飾子と型 | オプションの要素と説明 |
---|---|
AdviceMode | mode トランザクションアドバイスの適用方法を示します。 |
int | order 特定のジョインポイントで複数のアドバイスが適用される場合、トランザクションアドバイザーの実行の順序を示します。 |
boolean | proxyTargetClass 標準の Java インターフェースベースのプロキシ( false )ではなく、サブクラスベース(CGLIB)のプロキシを作成する(true )かどうかを示します。 |
public abstract boolean proxyTargetClass
false
)ではなく、サブクラスベース(CGLIB)のプロキシを作成する(true
)かどうかを示します。デフォルトは false
です。mode()
の場合のみ適用は AdviceMode.PROXY
に設定されます。 この属性を true
に設定すると、@Transactional
でマークされたものだけでなく、プロキシを必要とするすべての Spring 管理 Bean に影響することに注意してください。例: Spring の @Async
アノテーションでマークされた他の Bean は、同時にサブクラスプロキシにアップグレードされます。このアプローチは、テストなどで、ある型のプロキシと別の型のプロキシを明示的に期待しない限り、実際にはマイナスの影響はありません。
public abstract AdviceMode mode
デフォルトは AdviceMode.PROXY
です。プロキシモードでは、プロキシを介したコールの代行受信のみが許可されることに注意してください。同じクラス内のローカルコールはそのようにインターセプトできません。ローカル呼び出し内のそのようなメソッドの Transactional
アノテーションは、Spring のインターセプターがそのようなランタイムシナリオを実行しないため、無視されます。より高度な遮断モードについては、これを AdviceMode.ASPECTJ
に切り替えることを検討してください。
public abstract int order
デフォルトは Ordered.LOWEST_PRECEDENCE
です。