最佳@EnableTransactionManagement配置

时间:2014-03-21 20:59:22

标签: 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,加载时编织
  5. 我可以为我的应用程序初始化添加一些时间,只要它在运行时速度很快。

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

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

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

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

1 个答案:

答案 0 :(得分: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,加载时编织 仪表在运行时执行。您必须将aspectj代理作为jvm参数。

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

有关代理人的更多信息http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch08s06.html。 更多关于aspectJ with spring here http://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch07s08.html