我正在建立一个新的JPA + Spring项目。在我之间(作为程序员)有什么区别:
<tx:annotation-driven transaction-manager="transactionManager" />
和
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />
在我的applicationContext.xml中?
答案 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节“弹簧配置”。)
(从开发人员的角度来看)将使用哪种模式无关紧要。