Tomcat 8, Spring Boot, @Configurable LoadTimeWeaving без javaagent?
Я пытаюсь настроить объект домена @Configurable
(не управляемый контейнером spring).
У меня это работает, добавив -javaagent:path/to/spring-instrument.jar
в качестве аргумента JVM, но это не на 100% ясно для меня, должен ли этот -jawagent быть на месте. Я запускаю это на Tomcat 8. Возможно, я неправильно интерпретирую документацию, но, похоже, я могу использовать другой механизм для этого, в частности эту строку:
Не указывайте TomcatInstrumentableClassLoader
больше на Tomcat 8.0
и выше. Вместо этого пусть spring автоматически использует объект Tomcats new native InstrumentableClassLoader
через стратегию 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");
}
}
Так есть способ получить эти объекты @Configrable, сплетенные без указания -javaagent? Мне было бы интересно узнать, могу ли я это сделать при развертывании в качестве WAR на автономном сервере Tomcat 8 и/или использовании встроенного сервера Tomcat 8 при запуске в качестве "жирной" банки.
По мере развертывания для автономной работы сервер 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 agent: -javaagent:org.springframework.instrument.jar
Я полагаю, что реальный вопрос: как я Specify a custom LoadTimeWeaver
в Tomcat 8? Кажется, что ничего не происходит автоматически, как заявляет документация, но опять-таки я могу неправильно истолковать то, что это значит.
Ответы
Ответ 1
как насчет создания собственной аннотации @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
{}