我正在尝试设置@Configurable
域对象(不受弹簧容器管理)
我已经通过添加-javaagent:path/to/spring-instrument.jar
作为JVM参数来实现这一点,但是我不能100%清楚这个-javaagent是否必须到位。我在Tomcat 8上运行它。我可能会误解documentation但似乎我可以使用另一种机制来实现这一点,特别是这一行:
不要在
TomcatInstrumentableClassLoader
及更高版本上定义Tomcat 8.0
。相反,让Spring通过InstrumentableClassLoader
策略自动使用Tomcat的新本机TomcatLoadTimeWeaver
工具。
以下代码示例:
@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作为WAR部署到独立Tomcat 8服务器和/或在作为'胖'jar启动时使用嵌入式Tomcat 8服务器时完成此任务。
当它部署到Stand Stand时,Tomcat 8服务器不会抛出错误,但上面的getMyService()
方法返回null。启动为胖罐会在启动期间引发以下错误:
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中Specify a custom LoadTimeWeaver
?正如文档所述,似乎没有任何事情会自动发生,但我可能会误解这意味着什么。
答案 0 :(得分:1)
您可以尝试以下方法:
@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
}
}
答案 1 :(得分:-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
{}