【问题标题】:Legacy Spring application - what does the pointcut value mean?旧版 Spring 应用程序 - 切入点值是什么意思?
【发布时间】:2013-03-04 07:39:43
【问题描述】:

我“继承”了一个旧的 Spring 应用程序。目前它使用的是 Spring 2.5(只升级了一次),并希望进一步升级到 Spring 3。

我了解大部分应用程序配置。只有一个部分我“不是 100%”。我可以大致猜到这可能意味着什么,但我需要绝对确定,因此发布这个问题:

这里是配置sn-p(取决于此处未显示的注释驱动的事务管理器):

<aop:config>
    <aop:advisor pointcut="execution(* *..ProductManager.*(..))"
        advice-ref="txAdvice" />
</aop:config>

<tx:advice id="txAdvice">
    <tx:attributes>
        <tx:method name="save*" />
        <tx:method name="*" read-only="false" />
    </tx:attributes>
</tx:advice>

我的两个具体问题是:

  • “execution(* ..ProductManager.(..))”是什么意思(我理解切入点用语)
  • 在建议的属性部分,我们说将事务应用于所有与保存*相关的方法,并且对于所有内容,只读都是错误的。谁能解释为什么该设置有意义?对于所有具有事务支持的方法(即仅保存 * 方法),它是否是附加且有效的说法,我也希望这些方法不是只读事务。或者它是否对包容性交易过滤器(在切入点中定义)的每种方法应用了不同的东西(即某种形式的交易支持)。

感谢您的澄清。拜托,没有一般的答案 - 我需要一个具体的解释。

【问题讨论】:

    标签: java spring spring-transactions pointcut


    【解决方案1】:

    由于tx:method 具有read-only 属性,默认值为false,表示事务是读/写的。

    所以在我看来,

    <tx:method name="save*" read-only="false" /> <tx:method name="*" />

    等价于

    &lt;tx:method name="*" /&gt;

    【讨论】:

      【解决方案2】:

      execution(* *..ProductManager.*(..)) 表示,“对于 ProductManager 类中的所有方法”

      tx:advice 设置不是附加的。 它表示所有以 save 开头的方法都使用默认事务设置。 对于其他人,此设置意味着它们不是只读事务。

      按照常识,人们会期望

      <tx:method name="save*" read-only="false" />
      <tx:method name="*" />
      

      【讨论】:

      • Arikusu - 谢谢,很好的回应并同意我的理解。这是我多年来使用过的质量最差的应用程序之一。不幸的是,代码库中没有 ProductManager 类,所以我猜事务管理已经死了。我完全同意你关于 save* 行通常也是你规定为只读的行。它是您无法凭直觉知道的那些应用程序之一。不是一个测试用例,而且这个应用程序必须经过 6-8 年的构建和支持。是的,这些应用程序仍然存在。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2015-04-07
      • 2017-09-11
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多