使用自定义AnnotationTransactionAttributeSource与TX:注解驱动
我需要为了拦截事务属性自定义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。有没有什么办法可以强制发送:注解驱动我的CustomAnnotationTransactionAttributeSource这样我就可以避开所有这些配置? 。我读的文章,这可能是做BeanPostProcessor可以,但不知道它是如何对这种情况下的一个。
本文地址 :CodeGo.net/385957/
-------------------------------------------------------------------------------------------------------------------------
1.
<tx:annotation-driven>
什么都不做的魔法,它只是登记几乎bean定义你手动设置(参见
AnnotationDrivenBeanDefinitionParser
)。 所以,你可以替换引用
AnnotationTransactionAttributeSource
其他豆类,或更换其定义类属性。后者看起来simplier(尽管更脆弱相对于变化的弹簧代码),并且可以通过下面的做
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");
}
}
}