spring-instrument.jar 能做什么而aspectj-weaver.jar 不能?

问题描述 投票:0回答:1

我正在尝试配置我的 Spring Boot 应用程序以使用 AspectJ 加载时编织。使用byte-buddy代理热附加aspectj-weaver.jar似乎对于Spring bean和非Spring类(例如MyBatis TypeHandlers)都工作得很好。不过,我也看到了很多关于附加 spring-instruments.jar 和使用

@EnableLoadTimeWeaving
注释的建议,包括 Spring 文档。

  1. spring-instruments.jar 到底做了什么,aspectj-weaver.jar 没有?根据我的经验,即使对于Spring bean,spring-instruments.jar似乎也不足以启用LTW,并且aspectj-weaver.jar代理仍然需要可用,否则会出现无法找到
    aspectOf的错误
    方法。
  2. 如果同时附加了 spring-instruments.jar(带有
    @EnableLoadTimeWeaving
    )和spectj-weaver.jar,Spring bean 会被编织两次吗?
aop aspectj spring-aop load-time-weaving
1个回答
0
投票
  1. 它的作用类似于您使用 byte-buddy-agent 所做的事情,即热附加方面jweaver。也就是说,你基本上是在重新发明轮子。热附加的缺点是,在热附加发生之前编织一些已经处于活动状态的类和类加载器为时已晚。更好的选择是使用

    javaagent:/path/to/aspectjweaver.jar
    ,因为这样依恋会尽早发生。

  2. 不,任何东西都不会被编织两次。

现在,如果您绝对希望避免

-javaagent:...
但正在使用可执行(Spring Boot)JAR,我有一个好东西给您。引用我在类似上下文中写的其他答案:


如果您在 JRE 9+ 上以 可执行 JAR 的形式运行应用程序(Spring Boot 或其他类型),那么 Agent Embedder Maven Plugin 可能就是您想要的。

它使您能够在可执行 JAR 中嵌入 Java 代理,并使用

Launcher-Agent-Class
JVM 机制自动启动它。

此插件添加的独特功能,通过原始 JVM 机制不可用:您可以

  • 嵌入并运行多个代理(JVM 仅支持一个开箱即用的代理),
  • 选项字符串传递给每个代理,就像从 JVM 命令行一样。

剧透:我是该插件的作者,也恰好是 AspectJ 的当前维护者。

P.S.:对于 AspectJ 编织器,由于 JVM 很早就启动代理,编织将处于活动状态,无需额外的 Spring 配置,并且它应该适用于所有类加载器 - 不再出现热附加编织器时出现的

ClassLoader [...] does NOT provide an 'addTransformer(ClassFileTransformer)' method
错误通过
spring-instrument.jar

© www.soinside.com 2019 - 2024. All rights reserved.