Spring:注释驱动的事务管理器

时间:2010-11-11 15:22:43

标签: java spring transactions

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

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

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

在我的applicationContext.xml中?

2 个答案:

答案 0 :(得分:28)

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

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

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

答案 1 :(得分:6)

The docs说:

  

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

(从开发人员的角度来看)将使用哪种模式无关紧要。