使用带有tx:annotation-driven的Custom AnnotationTransactionAttributeSource

时间:2011-11-29 19:45:45

标签: spring spring-transactions

我需要使用Custom 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-driven来使用我的CustomAnnotationTransactionAttributeSource,以便我可以避免所有这些配置? 。我在其中一篇帖子中读到这可以通过使用BeanPostProcessors来完成,但不知道如何在这种情况下使用它。

1 个答案:

答案 0 :(得分:4)

<tx:annotation-driven>没有做任何魔术,它只是手动注册几乎相同的bean定义(参见AnnotationDrivenBeanDefinitionParser)。

因此,您可以从其他bean替换对AnnotationTransactionAttributeSource的引用,或者在其定义中替换类名属性。后者看起来更简单(虽然对于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");
        }            
    }       
}