如何解决如何在不使用-javaagent的情况下使用加载时间编织?
我试图在不使用Aspectweaver和spring-instrument的javaagent jar文件的情况下启用loadtimeweaving。这是我为实现相同目的而实施的方法,但是它不起作用。
@ComponentScan("com.myapplication")
@EnableAspectJAutoproxy
@EnableSpringConfigured
@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.AUTODETECT)
public class AopConfig implements LoadTimeWeavingConfigurer {
@Override
public LoadTimeweaver getLoadTimeweaver() {
return new ReflectiveLoadTimeweaver();
}
/**
* Makes the aspect a Spring bean,eligible for receiving autowired components.
*/
@Bean
public InstrumentationLoadTimeweaver loadTimeweaver() throws Throwable {
InstrumentationLoadTimeweaver loadTimeweaver = new InstrumentationLoadTimeweaver();
return loadTimeweaver;
}
}
解决方法
我发现一种解决方法是从InstrumentationSavingAgent
热连接spring-instrument
而不是通过-javaagent
命令行参数启动代理。但是为此,您需要一个Instrumentation
实例。我只是使用了一个很小的帮助程序库byte-buddy-helper
(可以独立于ByteBuddy运行,不用担心)。如果由于某些原因无法正常工作,请确保在Java 9+ JVM中激活了Attach API。
因此,请摆脱配置类中的implements LoadTimeWeavingConfigurer
和两个工厂方法,只需执行以下操作即可:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy-agent</artifactId>
<version>1.10.14</version>
</dependency>
@SpringBootApplication
public class Application {
public static void main(String[] args) {
Instrumentation instrumentation = ByteBuddyAgent.install();
InstrumentationSavingAgent.premain("",instrumentation);
ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
// ...
}
}
如果有任何您不理解的问题,请随时提出后续问题。
更新:我注意到的另一件事是,它仅对aspectjWeaving = ENABLED
有效,不适用于AUTODETECT
。对于一个示例Spring bean,我注意到@Component
不起作用,可能是因为Spring与AspectJ之间存在一些引导问题。因此,我用一个明确的@Bean
配置代替了它,然后它起作用了。像这样:
@Configuration
@ComponentScan("com.spring.aspect.dynamicflow")
@EnableLoadTimeWeaving(aspectjWeaving = ENABLED)
public class ApplicationConfig {
@Bean
public JobProcess jobProcess() {
return new JobProcessImpl();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。