7

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

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

好的,以下是相关选项:

  1. 建议模式=代理,代理目标类=真
  2. 建议模式=代理,代理目标类=假
  3. adviceMode=aspectJ,编译时编织
  4. adviceMode=aspectJ,加载时编织

我可以为我的应用程序初始化增加一些时间,只要它在运行时速度很快。

那么这四种配置事务管理的方式有哪些取舍呢?

是否也有功能权衡,或者这只是一个性能问题?

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

另请注意,网络上有关此的大多数信息确实已过时。所以我正在寻找当前的比较。

4

1 回答 1

7

此配置说明如何应用事务方面。简要地:

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

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

因此,对于adviceMode=proxy,决定更多地取决于您的代码标准如何以及使用的代理机制会产生什么约束。

adviceMode=aspectJ 使用 aspectJ 库,它执行字节码插入而不是代理。

adviceMode=aspectJ, compile-time weaving 您应该在构建脚本的构建过程中加入 aspectJ 检测。

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

使用 aspectJ 更强大,并且可能更高效。就您想要交易的类的限制而言,它的侵入性也较小。但是,代理模式是简单的 Spring 开箱即用的解决方案。

更多关于代理的信息在这里http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch08s06.html。更多关于aspectJ的弹簧在这里http://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch07s08.html

于 2014-03-22T12:18:58.753 回答