AspectJ "around" and "proceed" with "before / after"

With this Test

@Aspect
public class TestAspect {
    private static boolean runAround = true;

    public static void main(String[] args) {
        new TestAspect().hello();
        runAround = false;
        new TestAspect().hello();
    }

    public void hello() {
        System.err.println("in hello");
    }

    @After("execution(void aspects.TestAspect.hello())")
    public void afterHello(JoinPoint joinPoint) {
        System.err.println("after " + joinPoint);
    }

    @Around("execution(void aspects.TestAspect.hello())")
    public void aroundHello(ProceedingJoinPoint joinPoint) throws Throwable {
        System.err.println("in around before " + joinPoint);
        if (runAround) {
            joinPoint.proceed();
        }
        System.err.println("in around after " + joinPoint);
    }

    @Before("execution(void aspects.TestAspect.hello())")
    public void beforeHello(JoinPoint joinPoint) {
        System.err.println("before " + joinPoint);
    }
}

i have following output

  1. in around before execution(void aspects.TestAspect.hello())
  2. before execution(void aspects.TestAspect.hello())
  3. in hello
  4. after execution(void aspects.TestAspect.hello())
  5. in around after execution(void aspects.TestAspect.hello())
  6. in around before execution(void aspects.TestAspect.hello())
  7. in around after execution(void aspects.TestAspect.hello())

so you can see before/after are not called when proceed is called from within @Around annotation.

Tags:

Java

Aop

Aspectj