【问题标题】:Spring: Annotation-driven Transaction ManagerSpring:注解驱动的事务管理器
【发布时间】:2011-05-08 13:06:02
【问题描述】:

我正在建立一个新的 JPA+Spring 项目。有什么区别(对我作为程序员来说):

<tx:annotation-driven transaction-manager="transactionManager" />

<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />

在我的 applicationContext.xml 中?

【问题讨论】:

    标签: java spring transactions


    【解决方案1】:

    代理和字节码编织方面存在巨大差异。 代理只能在调用来自“外层空间”时拦截,但如果调用来自对象本身(this.transactionalMethod())则不能拦截

    这意味着如果您有一个具有两个方法 T 和 B 的类。方法 T 具有事务注释,并且方法 B 通过 “this.T() 调用 T,则永远不会调用代理(对于T) 所以在这种情况下没有事务处理!

    如果你使用AspectJ,事务处理代码被编织在T的字节码中,无论调用是来自对象本身还是来自其他对象,它都会被执行。

    【讨论】:

    • 非常感谢您用简洁明了的语言进行解释。
    【解决方案2】:

    The docs说:

    默认模式“代理”使用 Spring 的 AOP 框架处理要代理的注解 bean(遵循代理语义,如上所述,仅适用于通过代理传入的方法调用)。替代模式“aspectj”将受影响的类与 Spring 的 AspectJ 事务方面编织在一起,修改目标类字节码以应用于任何类型的方法调用。 AspectJ 编织需要在类路径中使用 spring-aspects.jar 并启用加载时编织(或编译时编织)。 (有关如何设置加载时编织的详细信息,请参阅第 7.8.4.5 节,“弹簧配置”。)

    使用哪种模式并不重要(从开发人员的角度来看)。

    【讨论】:

      猜你喜欢
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      相关资源
      最近更新 更多