AspectJ Pointcut не работает с аннотациями с Element.TYPE, такими как @Component - PullRequest
2 голосов
/ 30 мая 2019

Я использую AspectJ и пытаюсь использовать Pointcut для аннотации @Component.

@Pointcut("@annotation(org.springframework.stereotype.Component)")
   public void bean() {
}

@Before("bean()")
public void beforeBeanCreation(JoinPoint jp) {
    System.out.println("Works!");
}

Моя конфигурация выглядит следующим образом:

@Configuration
@ComponentScan({"com.app.pl"})
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED)
public class AppConfiguration{

}

Все работает, когда я хочу указать на аннотацию с ElementType.METHOD или на bean-компонент с определенным именем. Но Pointcut на аннотации с ElementType.TYPE не работает. Я предполагаю, что это проблема, связанная с аннотациями, которые они прочитали раньше, чем прокси AspectJ.

Есть идеи, как это решить?

1 Ответ

0 голосов
/ 31 мая 2019

Возможно, вы используете не AspectJ, а Spring AOP. Итак, есть несколько вещей, которые следует учитывать:

  • Обычно аспекты Spring AOP работают на @Component s, а не на элементах, отличных от Spring. Для этого вам действительно понадобится AspectJ. Так что ваши источники Spring AOP так или иначе ищут эту аннотацию.
  • Аспекты Spring AOP также должны быть @Component s, но исключаются из автоматического плетения аспектов. В AspectJ вам потребуются особые меры предосторожности, чтобы исключить один аспект, связанный с другим, с такой же аннотацией, что и в обычном коде приложения. Вы должны учитывать это в ситуациях, когда вы объединяете Spring AOP с полным AspectJ.

Теперь, что касается вашего вопроса AOP, вы не можете перехватывать точки соединения в аннотированном классе с помощью @annotation() pointcut, как вы уже заметили. Вам нужно использовать @within() вместо этого, например ::

@within(org.springframework.stereotype.Component)

Обратите внимание, что это будет перехватывать все точки соединения в аннотированных классах, то есть в случае Spring AOP все выполнения методов. Он не будет перехватывать создание бина, если, как показывает ваше лог-сообщение, это ваша цель.

...