Tomcat 8,Spring Boot,@Configurable LoadTimeWeaving是否可以在没有-javaagent的情况下使用?

14

我正在尝试设置一个@Configurable领域对象(不由Spring容器管理)。


通过将-javaagent:path/to/spring-instrument.jar添加为JVM参数,我已经让它工作了,但我不完全清楚是否必须放置这个-javaagent。我在Tomcat 8上运行这个应用程序。我可能误解了文档,但似乎我可以使用另一种机制来实现这一点,特别是这一行:

Tomcat 8.0及更高版本中不再定义TomcatInstrumentableClassLoader。取而代之的是,通过TomcatLoadTimeWeaver策略自动使用Tomcat的新本地InstrumentableClassLoader功能。

以下是代码示例:

@SpringBootApplication
@EnableLoadTimeWeaving
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }   
    @Bean
    public MyService myService(){
        return new MyService();
    }
}

@Configurable
public class MyDomainObject {

    @Autowired
    private MyService myService;

    public MyService getMyService(){
        return myService;
    }
}

 public class MyService {
    private static final Logger log = LoggerFactory.getLogger(MyService.class);

    public void test(){
        log.info("test");
    }
}

那么有没有一种方法可以在不指定-javaagent的情况下编织这些@Configrable对象呢?我很想知道是否可以在部署为WAR到独立的Tomcat 8服务器时以及在启动为“fat” jar时使用嵌入式Tomcat 8服务器实现这一点。

目前,部署到独立的Tomcat 8服务器不会抛出错误,但上面的getMyService()方法将返回null。在启动“fat” jar时,会在启动期间引发以下错误:

Caused by: java.lang.IllegalStateException: ClassLoader [sun.misc.Launcher$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar

我想真正的问题是如何在Tomcat 8中指定自定义的LoadTimeWeaver?文档中并没有自动发生任何事情,但我可能误解了这个意思。


1
我现在也遇到了同样的问题,你解决了吗? - alexanoid
@alexanoid 很遗憾,我没有。 - mjj1409
2个回答

1

you can try this :

@Bean
public InstrumentationLoadTimeWeaver loadTimeWeaver() {
    return new InstrumentationLoadTimeWeaver();
}

或者

现在有一个新的库,可以动态设置Spring InstrumentationLoadTimeWeaver以启用支持切面的功能,而无需使用显式的Java代理启动JVM。

<dependency>
    <groupId>de.invesdwin</groupId>
    <artifactId>invesdwin-instrument</artifactId>
    <version>1.0.2</version>
</dependency>

@SpringBootApplication
@EnableLoadTimeWeaving
public class TestApplication{
    public static void main(final String[] args) {
        DynamicInstrumentationLoader.waitForInitialized(); //dynamically attach java agent to jvm if not already present
        DynamicInstrumentationLoader.initLoadTimeWeavingContext(); //weave all classes before they are loaded as beans
        SpringApplication.run(TestApplication.class, args); //start application, load some classes
    }
}

-2

你可以创建自己的注解 @MyConfigurable,这样当它的方法被调用时,你就可以随心所欲地进行操作。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.CONSTRUCTOR)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyConfigurable
{}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接