Ответ № 1: Вызов только рекомендованного метода (Around Advice)
Если вы автоматически подключаете свой сервис обратно к своему аспекту, вы все равно задействуете прокси-механизм Spring, включая аспект AOP, который вы применили к своему сервису.
См. «Вокруг совета» в главе AOP Spring:
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-ataspectj-around-advice
В основном, сделайте что-то вроде этого:
@AfterReturning("...")
public void execute(ProceedingJoinPoint p, BarObject returnVal)
{
// do something with BarObject
// ...
// call original method with original args
p.proceed(p.getArgs());
}
Я не уверен на 100% в коде, но proceed()
должен вызывать целевой метод напрямую, без рекурсивного вызова прокси-сервера AOP.
Ответ № 2: вызов нескольких методов целевого объекта
Если вам нужно вызвать несколько методов из этого сервисного объекта в вашем аспекте, вам потребуется доступ к незафиксированному объекту через getTarget()
:
@AfterReturning("...")
public void execute(JoinPoint p, BarObject returnVal)
{
// do something with BarObject
// ...
// call various service methods without triggering this AOP proxy again
// by using getTarget() to get the unproxied object:
MyService myService = (MyService) p.getTarget();
myService.update(...); // does not trigger AOP interceptor
myService.otherMethod(...); // neither does this
myService.thirdMethod(...); // nor this
}