我需要使用自定义 AnnotationTransactionAttributeSource 来拦截事务属性。现在,我使用 TransactionInterceptor 执行此操作,并将其注入(inject) 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-driven 使用我的 CustomAnnotationTransactionAttributeSource 以便我可以避免所有这些配置? 。我在一篇文章中读到,这可以通过使用 BeanPostProcessors 来完成,但不确定如何在这种情况下使用它。
最佳答案
<tx:annotation-driven>
没有做任何神奇的事情,它只是注册与手动操作几乎相同的 bean 定义(请参阅 AnnotationDrivenBeanDefinitionParser
)。
因此,您可以替换对 AnnotationTransactionAttributeSource
的引用来自其他 bean,或替换其定义中的类名属性。后者看起来更简单(尽管相对于 Spring 代码的更改来说更脆弱)并且可以通过以下 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");
}
}
}
关于spring - 使用自定义 AnnotationTransactionAttributeSource 和 tx :annotation-driven,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8316747/