【问题标题】:How to enable transactional behavior using Spring XML configuration?如何使用 Spring XML 配置启用事务行为?
【发布时间】:2014-12-26 12:17:33
【问题描述】:

我正在学习Spring Core认证,我对XML配置文件的声明式事务配置有以下疑问。

所以我知道我可以配置事务行为注释类和\或必须是事务行为的方法,如下所示:

@Transactional(timeout=60)
public class RewardNetworkImpl implements RewardNetwork {

    public RewardConfirmation rewardAccountFor(Dining d) {
        // atomic unit-of-work
    }

    @Transactional(timeout=45)
    public RewardConfirmation updateConfirmation(RewardConfirmantion rc) {
        // atomic unit-of-work
    }
}

我也知道有时我不能使用注释来配置类和\或方法的事务行为(例如,如果我没有包含必须以事务方式工作的方法的类的 Java 代码)。

所以我可以使用 XML 配置 和 AOP 来配置事务行为。

阅读文档我知道我可以这样做:

  1. AOP 切入点声明建议的内容。

  2. Spring 的 tx 命名空间可以简洁地定义 交易建议。

  3. 可以将事务行为添加到任何用作 春豆

我有以下示例与如何操作有关:

<aop:config>
    <aop:pointcut id=“rewardNetworkMethods” expression=“execution(* rewards.RewardNetwork.*(..))”/>
    <aop:advisor pointcut-ref=“rewardNetworkMethods” advice-ref=“txAdvice”/>
</aop:config>

<tx:advice id=“txAdvice”>
    <tx:attributes>
        <tx:method name="get*" read-only="true" timeout="10"/>
        <tx:method name="find*" read-only="true" timeout="10"/>
        <tx:method name="*" timeout="30"/>
    </tx:attributes>
</tx:advice>

<bean id=“transactionManager”
class=“org.springframework.jdbc.datasource.DataSourceTransactionManager”>
    <property name=“dataSource” ref=“dataSource”/>
</bean>

好的,但是现在我有一些问题要理解以前的 XML 配置到底是做什么的。

我认为第一部分代表了我想要建议的声明:

<aop:config>
    <aop:pointcut id=“rewardNetworkMethods” expression=“execution(* rewards.RewardNetwork.*(..))”/>
    <aop:advisor pointcut-ref=“rewardNetworkMethods” advice-ref=“txAdvice”/>
</aop:config>

所以在这种情况下,我声明了一个与 rewards.RewardNetwork 中的所有方法相关的切入点,这些方法采用任何参数并返回任何类型的对象。

所以这意味着我想在所有这些方法中添加事务行为?还是什么?

这个标签的第二行到底是什么意思?,这个:

<aop:advisor pointcut-ref=“rewardNetworkMethods” advice-ref=“txAdvice”/>

然后,在第二部分中,在我看来,它指定了前一个切入点表达式选择的方法的子集,并且为这些方法启用了事务行为:

<tx:advice id=“txAdvice”>
    <tx:attributes>
        <tx:method name="get*" read-only="true" timeout="10"/>
        <tx:method name="find*" read-only="true" timeout="10"/>
        <tx:method name="*" timeout="30"/>
    </tx:attributes>
</tx:advice>

在这种情况下,我认为使用 tx 命名空间来启用简洁的定义 交易建议:

  • 所有以get开头的方法
  • 所有以 find 开头的方法
  • 第三个 tx 标签选择了什么? (*)

在我看来,它首先使用 AOP 选择切入点来选择目标类和方法 我想在其上启用事务行为,然后使用 tx 标记来选择特定方法的子集以实现真正的事务性。

如果是这样,为什么存在选择方法并使其具有事务性的双重步骤?

是对的还是我错过了什么?你能具体解释一下这个配置的逻辑是什么吗?

【问题讨论】:

    标签: java spring transactions spring-transactions


    【解决方案1】:
    <aop:advisor pointcut-ref=“rewardNetworkMethods” advice-ref=“txAdvice”/>
    

    这一行表示为切入点定义

    <aop:pointcut id=“rewardNetworkMethods” expression=“execution(* rewards.RewardNetwork.*(..))”/>
    

    将执行名为 txAdvise 的建议。第二部分

    <tx:advice id=“txAdvice”>
    <tx:attributes>
        <tx:method name="get*" read-only="true" timeout="10"/>
        <tx:method name="find*" read-only="true" timeout="10"/>
        <tx:method name="*" timeout="30"/>
    </tx:attributes>
    

    是 tAdvice 建议的具体定义。首先很明显,建议是事务行为定义。 txAdvice 中的 * 表示 get* 和 find* 行不匹配的所有内容都将获得 * 定义。

    您是对的,此配置允许(但不强制)某些重复。在我的理解中,这是因为 aop 命名空间中的第一部分是一般的 spring AOP,需要说明哪些 Java 功能需要 AOP-ed(默认代理)。第二部分将具体的 AOP 代理定义为 tx 代理,并允许微调 tx 行为。您不能将其放入 AOP 部分,因为 aop 命名空间是通用 AOP 并且对事务一无所知。另一方面,根据给定的建议对 tx 行为进行微调通常很方便。通常,您会为包中的所有服务声明切入点,然后为给定的方法命名模式声明通用 tx 建议(就像在您的示例中一样)。通过这种方式,您可以获得非常统一且通用的 tx 定义,这是基于注释的定义所无法实现的。

    【讨论】:

      猜你喜欢
      • 2014-03-27
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 2022-01-27
      • 1970-01-01
      • 2016-03-21
      相关资源
      最近更新 更多