Spring Boot - не удается заставить время загрузки работать с аспектом

Может ли кто-нибудь сказать мне, почему аспект не срабатывает при использовании весенней загрузки? Я пытаюсь настроить плетение времени загрузки с помощью aspectj, чтобы я мог посоветовать частные методы.

Вот ссылка на базовый проект - https://github.com/satb/spring_aop_test_project.git

Запустите класс «App» с помощью «-javaagent:path/to/spring-instrument-4.1.0.RELEASE.jar» (или какой-либо другой версии библиотеки на вашем компьютере) и запустите команду curl

curl -i http://localhost:8080/test-app/motd

У класса MyAspect есть рекомендация, которая должна выполняться при вызове закрытого метода MyService. Но в этом случае ничего не происходит.

Однако, когда приложение запускается, я вижу такое сообщение:

[AppClassLoader@58644d46] warning javax.* types are not being woven because the weaver option '-Xset:weaveJavaxPackages=true' has not been specified.

Я попытался следовать предложению отсюда, чтобы заставить его работать, но это не помогло - Использование @Autowired с AspectJ и Springboot


person sat    schedule 07.09.2014    source источник
comment
Пожалуйста, не задавайте один и тот же вопрос дважды. Я ответил на на другой.   -  person kriegaex    schedule 08.09.2014
comment
возможный дубликат переплетение времени загрузки Spring Boot AOP   -  person kriegaex    schedule 08.09.2014


Ответы (2)


Хорошо, я быстро просмотрел ваш проект на GitHub. POM довольно странный, например. он не содержит никакой зависимости от spring-instrument. Кроме того, вы зависите от аспекта jweaver 1.8.2, но от аспекта 1.5.4. Вы действительно должны использовать одну и ту же версию для обоих.

Во всяком случае, я экспериментировал с разными агентами Java в командной строке, и кажется, что недостаточно просто использовать AspectJ weaver (результат: исключение) или просто инструмент Spring (результат: аспекты не работают, как вы описали). Вам нужно использовать оба:

java -javaagent:path/to/aspectjweaver-1.8.2.jar -javaagent:path/to/spring-instrument-4.1.0.RELEASE.jar ...

Это работает для меня с вашим кодом и дает следующее на консоли при использовании Curl в соответствии с вашим описанием:

[AppClassLoader@58644d46] warning javax.* types are not being woven because the weaver option '-Xset:weaveJavaxPackages=true' has not been specified

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.1.6.RELEASE)

2014-09-08 13:09:54.489  INFO 1464 --- [           main] App                                      : Starting App on Xander-PC with PID 1464 (C:\Users\Alexander\Documents\java-src\SO_AJ_SpringBootPrivilegedAspect\target\classes started by Alexander in C:\Users\Alexander\Documents\java-src\SO_AJ_SpringBootPrivilegedAspect)
2014-09-08 13:09:54.513  INFO 1464 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6771beb3: startup date [Mon Sep 08 13:09:54 CEST 2014]; root of context hierarchy
(...)
2014-09-08 13:09:56.257  INFO 1464 --- [           main] o.s.c.w.DefaultContextLoadTimeWeaver     : Found Spring's JVM agent for instrumentation
2014-09-08 13:09:56.259  INFO 1464 --- [           main] o.s.c.w.DefaultContextLoadTimeWeaver     : Found Spring's JVM agent for instrumentation
Aspect of called
(...)
2014-09-08 13:09:56.779  INFO 1464 --- [           main] App                                      : Started App in 2.531 seconds (JVM running for 3.067)
2014-09-08 13:09:59.115  INFO 1464 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2014-09-08 13:09:59.115  INFO 1464 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2014-09-08 13:09:59.122  INFO 1464 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 7 ms
Aspect of called
Advising getter
person kriegaex    schedule 08.09.2014
comment
@kregaex - Спасибо. Похоже, я пропустил добавление aspectjweaver в качестве javaagent. Не понимал, что это нужно. Хотя я читал об этом на SO, когда у кого-то была такая же проблема, у меня это не сработало, когда я добавил его в свой предыдущий тест. Поэтому я удалил его, думая, что это не проблема. Но, возможно, проблема тогда была в чем-то другом. И извините за тот же вопрос в другой раз. Я должен был добавить ссылку на этот базовый проект к самому другому вопросу. - person sat; 08.09.2014
comment
Более простым решением является динамическая загрузка агента без использования аргументов jvm: github.com/subes/invesdwin- инструмент - person subes; 16.01.2016
comment
Я пытаюсь понять, почему мне нужно загружать оба агента Java? В документации об этом не упоминается - person LppEdd; 18.02.2019
comment
Я не пользователь Spring, я просто хотел помочь. Я эксперт по AspectJ, поэтому я также могу немного помочь с Spring AOP или AspectJ через LTW в Spring. документация на самом деле говорит, что любого агента должно быть достаточно. Возможно, есть способ просто использовать spring-instrument и заставить его автоматически загружать ткач AspectJ, если все сделано правильно. Но что именно означает «сделано правильно», я понятия не имею. Есть другие, более квалифицированные, чем я, чтобы ответить на этот вопрос. Но он работает с обоими агентами в командной строке. - person kriegaex; 19.02.2019

Попробуйте объявить bean-компонент InstrumentationLoadTimeWeaver вместо явного использования -javaagent:/path/to/org.springframework.instrument-{version}.jar. Согласно документации

Чтобы использовать его, вы должны запустить виртуальную машину с агентом Spring, указав следующие параметры JVM:

-javaagent:/path/to/org.springframework.instrument-{версия}.jar

Обратите внимание, что для этого требуется изменение сценария запуска виртуальной машины, что может помешать вам использовать его в средах сервера приложений (в зависимости от ваших политик работы). Кроме того, агент JDK будет использовать всю виртуальную машину, что может оказаться дорогостоящим.

Я надеюсь, что сделать так, как показано ниже, будет лучше, я думаю.

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

То же самое можно сделать в xml конфигурация.

Найдена новая библиотека, которая просто решает динамическую настройку Spring InstrumentationLoadTimeWeaver, чтобы включить поддержку аспектов без необходимости запустить JVM с явным агентом Java

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

Конфигурация весенней загрузки

@SpringBootApplication
/** 
 * Make @Configurable work via @EnableLoadTimeWeaving.
 * If it does not work, alternatively you can try: 
 * @ImportResource(locations = "classpath:/META-INF/ctx.spring.weaving.xml") 
 */
@EnableLoadTimeWeaving
public class MySpringBootApplication {
    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(MySpringBootApplication.class, args); //start application, load some classes
    }
}
person Vikram Palakurthi    schedule 17.03.2015
comment
Это не работает с загрузочной банкой spring github.com/spring-projects/spring- загрузка/проблемы/739 - person Juzer Ali; 11.03.2016
comment
Я реализовал его с помощью spring boot jar и заставил его работать в производственном приложении, реализация не должна отличаться от весенней загрузки или обычной реализации spring. - person Vikram Palakurthi; 15.03.2016
comment
Вы развернули приложение весенней загрузки с помощью встроенного сервера tomcat? - person Juzer Ali; 15.03.2016
comment
Да, приложение работает на встроенном сервере Tomcat. - person Vikram Palakurthi; 16.03.2016
comment
Тогда мне интересно, что такое эта ошибка? - person Juzer Ali; 16.03.2016
comment
@VikramPalakurthi, как вы можете добиться пользовательского LoadTimeweaver с помощью xml? - person codeomnitrix; 22.05.2018