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