【发布时间】:2022-02-03 22:00:20
【问题描述】:
我正在尝试在 Spring Boot 应用程序中启用 AspectJ 加载时编织(不是 Spring AOP)。我的目标是在加载时将建议编织到带注释的字段和java.lang.reflect.Field.set(Object, Object)。
根据Spring docs,我试过了:
@Configuration
@EnableLoadTimeWeaving
public class Config {}
使用此配置运行 Spring Boot 应用程序导致应用程序上下文无法加载并显示此消息:
Caused by: java.lang.IllegalStateException:
ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader]
does NOT provide an 'addTransformer(ClassFileTransformer)' method.
Specify a custom LoadTimeWeaver or start your Java virtual machine
with Spring's agent: -javaagent:spring-instrument-{version}.jar
该消息中的后一个建议不是一个好的选择,因为我试图避免需要修改启动脚本。我需要编织的方面实际上驻留在一个库中,因此所有实现 Spring Boot 的项目都必须做出使 LTW 工作所需的任何更改。
我也试过这个配置:
@Configuration
@EnableLoadTimeWeaving
public class Config implements LoadTimeWeavingConfigurer {
@Override
public LoadTimeWeaver getLoadTimeWeaver() {
return new ReflectiveLoadTimeWeaver();
}
}
使用此配置运行 Spring Boot 应用程序导致应用程序上下文无法加载并显示此消息:
Caused by: java.lang.IllegalStateException:
ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader]
does NOT provide an 'addTransformer(ClassFileTransformer)' method.
看来我需要让 JVM 使用具有addTransformer(ClassFileTransformer) 方法的类加载器。我不知道该怎么做,尤其是在这种情况下。有什么建议吗?
【问题讨论】:
-
我想知道为什么这么多人拒绝修改启动脚本,而宁愿为像激活 Java 代理这样简单的事情更改编译的代码。热连接代理是可能的,但更具侵入性。此外,热附加的代理因此只能检测在附加代理之后加载的类,这使得这种设置有点脆弱。这有意义吗?
-
是的,这很有意义。我没有意识到,所谓的热附加代理会比在启动脚本中指定代理更具侵入性和脆弱性。谢谢你的澄清,kriegaex。
-
感谢您对我的一般性评论作出反应。我对你问题的实际回答呢?您是否至少验证过它是否适合您。你既没有接受也没有评论它。提前致谢。
-
我很抱歉。我需要一些时间来复习你的答案。这是一个工作项目,所以我周末没有工作。
标签: spring spring-boot classloader aspectj load-time-weaving