Включить Spring AOP или AspectJ

Из этого вопроса следует следующее:

Spring autwired bean для аспекта @Aspect является нулевым

Мое первоначальное понимание заключалось в том, что при использовании Spring AOP классы, аннотированные с @Aspect, создаются как Spring beans, поэтому инъекция зависимостей будет работать как обычно. Однако кажется, что объект с аннотацией @Aspect создается как одиночный элемент вне контейнера Spring, поэтому мне нужно настроить его в XML так, чтобы он был включен как Spring bean:

<bean id="aspect" class="com.mysite.aspect" factory-method="aspectOf" />

Теперь это меня полностью смутило. Я думал, что следующая конфигурация будет использовать Spring AOP:

<context:component-scan base-package="com.mysite.aspectPackage"/>
<aop:aspectj-autoproxy/>

Таким образом, он будет сканировать аннотации @Aspect, используя аспект создания компонента-сканирования beans, а затем autoproxy создаст beanPostProcessor, который проксирует все beans в моем контексте с помощью соответствующего совета. Я тогда подумал, чтобы включить aspectJ. Мне понадобится совершенно другая конфигурация XML (что, кстати, я не могу найти пример в документации). Именно эта конфигурация использует aspectJ для создания аспектов, которые будут за пределами моего контейнера или которые работают, манипулируя байт-кодом, а не проксированием.

Примечание
Это не вопрос разницы между Spring АОП и аспектом J, это хорошо сформулировано здесь:

Spring AOP vs AspectJ

Ответ 1

@Component создаст 2 экземпляра, один внутри контейнера Spring, другой внутри контейнера aspectJ.

используйте @Configurable, чтобы позволить Spring управлять внедрением зависимостей и т.д. для вашего класса, когда он создается контейнером aspectj.

@Aspect - это аннотация в стиле aspectj, поддерживаемая spring-aop, где для обработки перехвата используется ткачество во время выполнения и т.д.

Переплетение во время компиляции позволяет вам игнорировать использование точек-точек, присутствующих в байт-коде, это делается с помощью компилятора aspectj (см. Https://www.mojohaus.org/aspectj-maven-plugin/ для интеграции с mvn).

Независимо от того, используете ли вы компилятор aspectj или spring-aop, не имеет значения, он не создаст ваш аспект как управляемый bean-компонент так, как вы хотите, если вы не используете фабрику/конфигурируемость.

Конфигурация Aspectj - это, строго говоря, определения pointcut и т.д., Которые будут присутствовать внутри вашего класса.

Ответ 2

@Aspect не является аннотацией spring и не обнаруживается с помощью компонентного сканирования. Поэтому вам нужно как-то зарегистрировать его как spring bean. Решение aspectOf работает. Вы также можете попробовать

@Aspect
@Component

Ответ 3

Использование

  • @Aspect
  • @Configurable

Также добавьте "< context: spring -configured/" > " в файл конфигурации XML.