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

2022-09-03 17:14:53

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

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

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

在我的应用程序中上下文.xml?


答案 1

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

这意味着如果你有一个包含两个方法的类,T和B.方法有一个事务注释,并且方法调用“,那么代理永远不会被调用(for),所以在这种情况下没有事务处理!TBT“this.T()T

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


答案 2

文档说:

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

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


推荐