最佳@EnableTransactionManagement配置

rob*_*lco 7 spring spring-transactions aspectj-maven-plugin

我对这个主题感到很困惑,并且在Spring 4.x文档中看到了很少的建议.首先让我说我可以按照我想要的方式配置我的项目.静态编织,编织时编织,无编织等

我只想要最佳性能.但如果性能差异是微秒,那么我只想要最简单.我只关心会影响我的客户的性能差异.

好的,以下是相关选项:

  1. adviceMode = proxy,proxyTargetClass = true
  2. adviceMode = proxy,proxyTargetClass = false
  3. adviceMode = aspectJ,编译时编织
  4. adviceMode = aspectJ,加载时编织

只要在运行时速度很快,我就可以为应用程序初始化添加一些时间.

那么这四种配置事务管理方式之间的权衡是什么?

是否有功能权衡还是仅仅是性能问题?

请注意,我使用的是Spring 4.0.2和Java 1.7.如果有基本上回答这个问题的Spring 4.0文档,那么我道歉并且只是将我重定向到doc.到目前为止,我已经看到文档说明如何设置它们而不是它们如何比较.谢谢!

另请注意,网络上关于此的大部分信息都已过时.所以我正在寻找当前的比较.

小智 7

此配置说明如何应用事务方面.简述:

adviceMode = proxy,proxyTargetClass = true Cglib用作代理机制.如果你使用它,cglib必须在classpath上,你的代理类必须有非参数构造函数,并且它们不能是final的(cglib创建一个子类作为代理).

adviceMode = proxy,proxyTargetClass = false使用Jdk代理机制.您只能代理实现应该是事务性方法的接口的类.Jdk代理可以是类型转换为接口,但不能类型转换为原始代理类.

因此,对于adviceMode = proxy,决策更多地依赖于您的代码标准以及使用的代理机制产生的约束.

adviceMode = aspectJ使用aspectJ库,它执行字节代码检测而不是代理.

adviceMode = aspectJ,编译时编织您应该在构建脚本的构建过程中合并aspectJ检测.

adviceMode = aspectJ,加载时编织Instrumentation在运行时执行.您必须将aspectj代理作为jvm参数.

使用aspectJ更强大,可能性能更高.在对要成为事务的类的限制方面,它的侵入性也较小.但是,代理模式很简单,Spring的开箱即用解决方案.

更多关于代理http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch08s06.html.更多关于aspectJ with spring的内容http://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch07s08.html.