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

Joh*_*nak 12 java spring transactions

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

<tx:annotation-driven transaction-manager="transactionManager" />
Run Code Online (Sandbox Code Playgroud)

<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />
Run Code Online (Sandbox Code Playgroud)

在我的applicationContext.xml中?

Ral*_*lph 28

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

这意味着如果你有两个方法,T A类和B方法T有一个交易注解,以及方法B调用T“this.T()",那么代理就决不会调用(对T),所以没有交易在这种情况下处理!

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


Boz*_*zho 6

文档说:

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

从开发人员的角度来看,无关紧要的是使用哪种模式.