【问题标题】:Configuration alternative to Spring @TransactionalSpring @Transactional 的配置替代方案
【发布时间】:2010-06-23 07:30:34
【问题描述】:

Spring 中是否有任何基于配置的替代方法来替代 @Transactional 注释?

我想让我的 java 类尽可能不受 Spring 影响,即尽可能与任何框架分离。

【问题讨论】:

    标签: spring transactions


    【解决方案1】:

    是的,使用aop:configtx:advice。例如:

    <aop:config>
        <aop:pointcut id="serviceMethods"
            expression="execution(* com.package.service..*.*(..))" />
    
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
    </aop:config>
    
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>
    

    【讨论】:

    【解决方案2】:

    注解是标记方法应在事务中执行的最佳选择。这对于 Spring 和 EJB 3 都是推荐的。

    XML 方法需要更多配置,对重构不友好,您必须在配置中查看某个方法是否会在事务中执行。

    由于基于注解的事务支持是大多数开发人员的首选,并且您不喜欢使用 Spring 的 @Transactional 注解,我建议您使用自定义注解。

    那么你有两个选择:

    • 让您的自定义注释扩展 Spring 的 @Transactional 并在您的 Spring 配置中使用 &lt;tx:annotation-driven /&gt; 元素。这很简单,只需更新一个注解即可移除 Spring 依赖项。
    • 创建一个拦截器,在带注释的方法之前和之后执行逻辑。使用 Spring 作为容器,您应该将拦截器前后通知的事务处理委托给您首选的 PlatformTransactionManager 实现。

    我已经写过如何创建一个拦截器,它在标有注释here 的方法之前和之后添加逻辑。并演示了您必须在 PlatformTransactionManager here 上使用哪些方法。

    我希望这会有所帮助!

    【讨论】: