El Guapo
El Guapo

Reputation: 5781

Trigger a second advised method from a method already being advised in Spring

I have a Class, call it X, in this class I have successfully advised a method call it method(){} from an Annotated Spring.

So, here it is:

public class X {
    public void method(){...}
    public void method2(){...}
}

Here is my aspect, shortened of course:

@Aspect
public class MyAspect{
    @Pointcut("execution(* X.method(..))")
    public void methodJP(){}

    @Pointcut("execution(* X.method2(..))")
    public void method2JP(){}

    @Around("methodJP()")
    public void doMethodJP(ProceedingJoinPoint pjp) throws Exception {
        pjp.proceed(); //Amongst other things!!!
    }

    @After("method2JP()")
    public void doMethod2JP(JoinPoint jp) throws Exception {
        //Do some stuff here
    }
}

Now... both join points work well, however, I within my X.method, I also call the method that is advised by method2JP()... and of course, my method2JP does not get triggered.

Is there any way I can get this to work?

Thanks.

Upvotes: 0

Views: 99

Answers (2)

pap
pap

Reputation: 27614

Since Spring AOP works by proxying classes, for the advice to be invoked, you must call the method through the proxy or wrapper supplied by the bean factory.

If you don't want to break out into multiple classes, you can have the method retrieve a the proxied version of "itself" from the beanfactory. Something like this

@Service
public class MyService {
    @Autowired
    ApplicationContext context;

    public void method1() {
        context.getBean(MyService.class).method2();
    }

    public void method2() {
    }

}

This will guarantee that the invocation of method2 from method1 will apply any aspects on the method2 pointcut.

Upvotes: 1

Bozho
Bozho

Reputation: 597046

methodJP() should be declared in another class. In the regular scenario the aspects are not triggered when you invoke a method from within the same object.

Upvotes: 1

Related Questions