【发布时间】:2019-09-12 04:18:16
【问题描述】:
也许这里有些人认识我。通常我是回答 AspectJ 问题的人。我认为自己是那里的专家。在许多情况下,即使我不是 Spring 用户,我也会回答 Spring AOP 问题。
不过,有两件事对我来说一直很神秘:
SO 和网络上其他地方的许多来源声称,将 Spring AOP 与 AspectJ 结合起来很容易,更准确地说是与加载时编织 (LTW) 结合。 只要 AspectJ通过编译时编织 (CTW) 应用我没有异议,因为在 Spring 应用程序启动之前已经应用了一个 (AspectJ),因此在这种情况下没有问题。但是,当我尝试将 Spring 配置为使用 Spring AOP 并同时在 Java 命令行上使用
-javaagent:/path/to/aspectjweaver.jar启动应用程序时,我只能让加载时编织 (LTW) 工作,而不再是 Spring AOP,没有不管@EnableAspectJAutoProxy和@EnableLoadTimeWeaving的组合我试过。作为一个侧面展示,我还想知道为什么 AspectJ LTW 从来没有像 Spring 手册所宣传的那样只使用
-javaagent:/path/to/spring-instrument.jar甚至不应用任何代理。手册说 Spring 可以检测到 aop.xml,然后在运行中自动激活 LTW。这对我永远不起作用。准确地说,使用 spring-instrument 代理 Spring 确实检测到我的方面并注册它们,但只有在 AspectJ 编织并直接在我的应用程序的主类中使用的目标类类已经加载之后。 IE。 AspectJ 编织器初始化太晚。
谁能在这里启发我并告诉我如何正确设置?这个问题与my answer here有关,因此您可以方便地克隆那里提到的示例GitHub project,切换到aspectj-ltw分支并从那里获取以配置应用程序以便仅通过AspectJ使用TaskAspects LTW(因为它拦截了其他方面,这在 Spring AOP 中是不可能的)和其他方面通过 Spring AOP。我真的很想看看这是否以及如何结合。
【问题讨论】:
-
我从来没有自己做过,但是我知道有@EnableLoadTimeWeaving注解可以用于这个目的。在这里找到了示例。 concretepage.com/spring/enableloadtimeweaving-spring-example。希望它以某种方式有所帮助:)
-
在回答之前先阅读我的问题和链接资源会很好。我知道如何激活 LTW,我什至在这个问题中提到了
@EnableLoadTimeWeaving。问题是关于如何将 Spring AOP 方面与 AspectJ 方面组合,即同时使用两者。 Spring 手册声称这是可能的,但没有全面解释如何。 -
我什至不知道 spring 可以选择像这样自动启用 LTW。我一直手动使用代理定义。但老实说,一旦我决定将完整的 AJ 添加到 Spring 项目中,我并没有发现使用 SpringAOP 的有限支持并完全坚持使用 AJ 的价值。
-
我只是好奇,仅此而已。文档和其他来源说你可以结合它,所以我想知道如何。如果您无论如何都在那个环境中工作并且只是在需要的地方添加额外的东西,那么将 Spring 的基础设施与组件配置、依赖注入等一起使用实际上是有意义的。我开始怀疑没有人真正知道如何做到这一点,或者在过去几年中尝试过,这可以解释没有示例的原因。但我还没有放弃。
-
我真的很想知道反对票是为了什么。这个问题有什么问题或不好的地方?
标签: spring spring-boot aspectj spring-aop load-time-weaving