spring - 使用自定义 AnnotationTransactionAttributeSource 和 tx :annotation-driven

标签 spring spring-transactions

我需要使用自定义 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/

相关文章:

java - JSP 错误 : According to TLD, 标记形式 :input must be empty, 但不是

java - 如何使用 Spring Batch 查看集群中的所有作业?

java - Spring Jackson 通过 Id 引用现有对象反序列化对象

java - 如何在 Spring 中处理具有并发访问的事务

java - Spring 透视图未在 Eclipse 中显示

java - 部署应用程序时未找到 DefaultSpringSecurityContextSource

java - 使用 Atomikos 在 Tomcat 服务器中正确设置 JTA 事务管理器

java - 如何摆脱 em.persist();

java - 在用 spring 的 @Transactional 注释的方法中抛出并捕获未经检查的异常是否仍会导致事务回滚?

java - Spring @Transactional 基于方法级别的条件