我正在尝试设置一个@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
?文档中并没有自动发生任何事情,但我可能误解了这个意思。