Search code examples
springannotationsaopwrapperaspectj

Wrap a spring aspects with another aspect


I've declared two aspects as foo & bar over a function runFunc and I want to capture time taken to run the function runcFunc & Bar in Foo, but it is capturing the time only for runFunc. Bar is running independently.

I want that If I put two annotation over a function, the 1st annotation should wrap the 2nd annotation and the 2nd one should wrap the function runfunc. How can I achieve that?


Solution

  • It turns out aspect can wrap other aspects just as easily as they can wrap a function.

    Following code works.

    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(value = RetentionPolicy.RUNTIME)
    public @interface Foo {}
    
    
    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(value = RetentionPolicy.RUNTIME)
    public @interface Bar {}
    
    
    @Aspect
    @Component
    public class A {
    
        @Around("@annotation( foo )")
        public void func1(final ProceedingJoinPoint pjp, Foo foo) throws Throwable {
            System.out.println("foo start");
            pjp.proceed();
            System.out.println("foo end");
        }
    }
    
    
    @Aspect
    @Component
    public class B {
    
        @Around("@annotation( bar )")
        public void func2(final ProceedingJoinPoint pjp, Bar bar) throws Throwable {
            System.out.println("bar start");
            pjp.proceed();
            System.out.println("bar end");
        }
    }
    

    The below code:

    @Foo
    @Bar
    public void runFunc(){
        System.out.println("Inside Run.runFunc");
    }
    

    outputs the following:

    foo start
    bar start
    Inside Run.runFunc
    bar end
    foo end