カスタムAnnotationTransactionAttributesourceを使用してTx:Annotation-drivenを使用します
-
25-10-2019 - |
質問
トランザクション属性を傍受するには、カスタムAnnotationTransactionAttributesourceを使用する必要があります。現在、TransactionInterceptorを使用してこれを行い、TransactionAttributesourCeadVisorにこれを注入します。プロキシは、以下に示すようにDefaultAdvisorautoproxycreatorを使用して作成されます。
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<property name="transactionInterceptor" ref="txInterceptor"/>
</bean>
<bean id="txInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="txManager"/>
<property name="transactionAttributeSource">
<bean class="org.myProject.transaction.CustomAnnotationTransactionAttributeSource"/>
</property>
</bean>
ここでは、CustomAnnotationTransactionAttributesourceがAnnotationTransactionAttributesourceを拡張します。これらすべての構成を回避できるように、TX:Annotation-Annotation-stranceDivenのCustomAnnotationTransactionAttributesourceを使用するように強制する方法はありますか? 。投稿の1つで、これはBeanPostProcessorsを使用することで実行できるが、このケースに使用する方法がわからないことを読みました。
解決
<tx:annotation-driven>
魔法は何もしません、それはあなたが手動で行うのとほぼ同じ豆の定義を登録するだけです(参照してください AnnotationDrivenBeanDefinitionParser
).
したがって、参照を置き換えることができます AnnotationTransactionAttributeSource
他の豆から、またはその定義でクラス名プロパティを置き換えます。後者はよりシンプルに見えます(春のコードの変更に関してはより脆弱ですが)。 BeanFactoryPostProcessor
:
public class AnnotationTransactionAttributeSourceReplacer implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory factory)
throws BeansException {
String[] names = factory.getBeanNamesForType(AnnotationTransactionAttributeSource.class);
for (String name: names) {
BeanDefinition bd = factory.getBeanDefinition(name);
bd.setBeanClassName("org.myProject.transaction.CustomAnnotationTransactionAttributeSource");
}
}
}