微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在不使用-javaagent的情况下使用加载时间编织?

如何解决如何在不使用-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 举报,一经查实,本站将立刻删除。