我正在尝试配置我的 Spring Boot 应用程序以使用 AspectJ 加载时编织。使用byte-buddy代理热附加aspectj-weaver.jar似乎对于Spring bean和非Spring类(例如MyBatis TypeHandlers)都工作得很好。不过,我也看到了很多关于附加 spring-instruments.jar 和使用
@EnableLoadTimeWeaving
注释的建议,包括 Spring 文档。
aspectOf
的错误
方法。@EnableLoadTimeWeaving
)和spectj-weaver.jar,Spring bean 会被编织两次吗?它的作用类似于您使用 byte-buddy-agent 所做的事情,即热附加方面jweaver。也就是说,你基本上是在重新发明轮子。热附加的缺点是,在热附加发生之前编织一些已经处于活动状态的类和类加载器为时已晚。更好的选择是使用
javaagent:/path/to/aspectjweaver.jar
,因为这样依恋会尽早发生。
不,任何东西都不会被编织两次。
现在,如果您绝对希望避免
-javaagent:...
但正在使用可执行(Spring Boot)JAR,我有一个好东西给您。引用我在类似上下文中写的其他答案:
如果您在 JRE 9+ 上以 可执行 JAR 的形式运行应用程序(Spring Boot 或其他类型),那么 Agent Embedder Maven Plugin 可能就是您想要的。
Launcher-Agent-Class
JVM 机制自动启动它。
此插件添加的独特功能,通过原始 JVM 机制不可用:您可以
剧透:我是该插件的作者,也恰好是 AspectJ 的当前维护者。
P.S.:对于 AspectJ 编织器,由于 JVM 很早就启动代理,编织将处于活动状态,无需额外的 Spring 配置,并且它应该适用于所有类加载器 - 不再出现热附加编织器时出现的
ClassLoader [...] does NOT provide an 'addTransformer(ClassFileTransformer)' method
错误通过spring-instrument.jar
。