Переплетение времени загрузки для непружинных бобов в весеннем приложении

У меня есть приложение весенней загрузки с некоторыми контроллерами REST, классами обслуживания и вспомогательными классами. Контроллеры и сервисные классы управляются пружиной, а вспомогательные классы не управляются пружиной и в основном содержат статические методы.

Конфигурация AspectJ присутствует в конфигурации java следующим образом

@Configuration
@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED)
public class AspectConfig {

    @Bean
    public LoggingAspect loggingAspect() {
        return new LoggingAspect();
    }
}

Соответствующий класс LoggingAspect выглядит следующим образом:

@Aspect
public class LoggingAspect {

    @Before("allMethodsPointcut()")
    public void logBeforeMethod(JoinPoint joinPoint) {
        System.out.println("Entering Method - " + joinPoint.getSignature().getDeclaringType() + "::" + joinPoint.getSignature().getName());
    }

    @After("allMethodsPointcut()")
    public void logAfterMethod(JoinPoint joinPoint) {
        System.out.println("Exiting Method - " + joinPoint.getSignature().getDeclaringType() + "::" + joinPoint.getSignature().getName());
    }

    @Pointcut("execution(* com.test.controller..*(..)) || execution(* com.test.service..*(..)) || execution(* com.test.helper..*(..))")
    public void allMethodsPointcut() {
    }
}
  • При вызове контроллера ведение журнала с включенным аспектом работает для контроллера и сервисных функций, но не для вспомогательных функций.
  • Если мы автоматически подключаем вспомогательный класс в контроллере, нестатические вспомогательные методы начинают показывать журналы aspectj. Однако статические вспомогательные методы по-прежнему не отображают журналы аспектов.

Вопросы: 1. Как настроить рекомендации по аспектам для классов, которые не управляются Spring, т. е. без @Bean, @Autowired, @Component и т. д. 2. Как настроить рекомендации по аспектам для статических методов (я использую @EnableLoadTimeWeaving, но, возможно, я что-то упускаю) 3. Конфигурация AspectJ должна быть основана на Java, если это возможно

Пожалуйста, дайте мне знать, если требуется дополнительная информация


person Avi    schedule 29.12.2016    source источник


Ответы (1)


Используйте -javaagent:/path/to/aspectjweaver-<version>.jar в качестве аргумента запуска для вашей JVM, чтобы включить переплетение во время загрузки. Удалите @EnableAspectJAutoProxy из конфигурации Spring, чтобы Spring не пытался использовать собственную структуру Spring AOP вместо чистого AspectJ. При желании создайте META-INF/aop.xml. Добавьте @EnableSpringConfigured, если вы хотите применить конфигурацию Spring к компонентам, не управляемым Spring (@Configurable POJO).

person Nándor Előd Fekete    schedule 29.12.2016
comment
Я читал подобные комментарии о переполнении стека, но мне интересно, почему он не работает с EnableLoadTimeWeaving, включенным в конфигурацию. Я НЕ включил EnableAspectJAutoProxy, поэтому spring не должен мешать процессу плетения. Кроме того, сервер развертывания может не находиться под моим контролем, поэтому я скептически отношусь к добавлению аргументов виртуальной машины командной строки. Что касается последней части, вы имеете в виду, что каждый класс, который не управляется Spring, должен быть аннотирован с помощью «Configurable»? - person Avi; 30.12.2016
comment
@EnableLoadTimeWeaving работает через магию загрузчика классов. Делать такие вещи через загрузку классов всегда рискованно, поэтому я стараюсь избегать этого, когда это возможно. Вот почему я никогда не использую Spring @EnableLoadTimeWeaving. Посмотрите на иерархию классов LoadTimeWeaver, чтобы узнать, какие среды поддерживаются. Затем выберите свою среду и просмотрите документацию по конкретному классу реализации для любой дополнительной конфигурации, которую вам, возможно, придется предоставить. Конечно, лучше всего было бы избавиться от всего этого и просто использовать время компиляции. Или просто возьмите под контроль свои серверы и используйте агент - person Nándor Előd Fekete; 30.12.2016
comment
Например, если вы используете версии Tomcat [6..8), вам нужно явно указать загрузчик классов: <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/> в файле META-INF/context.xml в файле war. - person Nándor Előd Fekete; 30.12.2016
comment
@Configurable аннотация необходима, если вы хотите, чтобы ваши не-пружинные управляемые компоненты были настроены во время создания к весне. Вам не нужно применять плетение к классам. Однако он вам понадобится, если эти управляемые классы, не относящиеся к Spring, имеют поля @Autowired или к ним необходимо применить любую другую постобработку Spring bean. - person Nándor Előd Fekete; 30.12.2016