Подтвердить что ты не робот

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? Кажется, что ничего не происходит автоматически, как заявляет документация, но опять-таки я могу неправильно истолковать то, что это значит.

4b9b3361

Ответ 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
{}