Как запустить совет аспекта для метода, который вызывается другим методом в том же классе
Я испытываю беспокойство по поводу Spring AOP. Я пытаюсь вызвать метод с использованием аспекта, но метод, который будет запускать аспект, также является методом того же класса, и аспект не работает (кстати, ошибок нет).
class A extends Runnable{
public void write(){
System.out.println('Hi');
}
public void run(){
this.write();
}
}
<aop:after-returning method="anyMethod" pointcut="execution(* A.write(..))"/>
Любые идеи будут оценены
Спасибо
3 ответа
Тот факт, что рекомендуемый метод вызывается в другом потоке, не имеет никакого значения. Просто убедитесь, что экземпляр, который вы передаете потоку, создан контекстом приложения Spring, а не кодом вашего приложения.
Кроме того, поскольку вы советуете метод, объявленный в классе, а не интерфейс - write()
- вам нужно выполнить ткачество во время загрузки (и иметь cglib в вашем classpath).
Это потому, что Spring AOP основан на прокси. Вы используете прокси для делегирования вызовов базовому объекту. Однако, когда метод нижележащего объекта выполняет вызов другого метода внутри него того же класса (ваш сценарий использования), прокси не появляется, и, следовательно, то, что вы пытаетесь достичь, невозможно. Есть некоторые обходные пути, но они убивают саму цель АОП.
Вы можете сослаться больше информации здесь.
http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/aop.html
Как сказал Абхишек Чаухан, Spring AOP основан на прокси и поэтому не может перехватывать прямые вызовы this.someMethod()
, Но хорошей новостью является то, что вы также можете использовать полнофункциональный AspectJ в приложениях Spring с помощью ткачества во время загрузки, как описано в руководстве Spring. Таким образом, вы можете избавиться от ограничений и даже от всех издержек прокси, потому что AspectJ не нуждается в прокси.