【问题标题】:Compile/load time weaving with spring用spring编译/加载时间编织
【发布时间】:2014-01-31 04:58:20
【问题描述】:

docs 解释说,LTW 必须通过使用<context:load-time-weaver/> xml 指令或使用@EnableLoadTimeWeaving 注释来启用。然而,我什么都没做,但我仍然看到我的项目中的各个方面都被正确地编织了!

  1. 在这种情况下,我不认为它们是在编译时编织的(但它们是吗?),所以它肯定是加载时编织的吗?
  2. 即使是这样,它如何在加载时自动选择编织方面?如果没有使用文档所说的上述方式之一打开这些方面,它们是否应该保持松散?
  3. 我的类路径中有 aspectj-weaver,但无论如何选择这两种编织类型都不够,对吗?

【问题讨论】:

  • 您是否实际创建或导入了需要编织的 AspectJ 方面?像 @Transactional 这样的 Spring AOP 特性在运行时代理中工作得很好,不需要编织。
  • 嗯,有没有我可以查看的需要编织和不需要编织的方面的列表?我在我的项目中只使用了带有 around 类型建议的日志记录方面。
  • 好的,我想我明白你的意思了。我对aspectj-autoproxy 的使用会通过运行时代理为我完成,因此不需要在编译/加载时编织方面。我说的对吗?

标签: java aspectj spring-aop


【解决方案1】:

Spring AOP 不依赖 AspectJ 字节码编织。它只是借用了用于从 AspectJ 项目定义方面的注释。它是一个单独实现的框架,使用运行时代理来实现方面。如果您的应用程序上下文中有<aop:aspectj-autoproxy />,那么spring 正在使用代理来实现在容器中的bean 上定义的受支持方面。

代理只能实现实际 AspectJ 系统全部功能的子集,基本上是包装方法的建议。由于其性质,代理具有以下限制:

  • 仅拦截外部调用(同时违反代理边界)
  • 仅拦截public 成员(private/protected 无法拦截)
  • 不知道拨打本地电话(或使用thissuper 拨打电话)

例如,如果您希望能够建议字段,则需要启用Native AspectJ

【讨论】:

  • 太棒了!但是通过使用 asectj-maven-plugin,我可以实现编译时编织。或通过<context:load-time-weaver /> 处理此事。这是否意味着这些编织技术中的一种将设法胜过<aop:aspectj:autoproxy /> 并被用来代替运行时代理?
  • 手册的这一部分描述了当你在同一个项目中同时拥有 Spring AOP 和 AspectJ 运行时如何配置:docs.spring.io/spring/docs/3.2.x/spring-framework-reference/…
  • 如果你为编织和代理配置了相同的方面......我猜它会执行两次?老实说从未尝试过:)
  • 它没有,它只运行了一次。所以我假设代理会胜过,无论目标是否与方面交织在一起。它根本不在乎检查目标是否完全由 IMO 编织而成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 2011-07-27
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多