Подтвердить что ты не робот

AspectJ "around" и "continue" с "before/after"

Скажем, у вас есть три совета: вокруг, до и после.

1) Вызываются до/после, когда продолжить вызывается в совете вокруг или они называются до/после советом вокруг в целом?

2) Если мой совет вокруг не вызывает продолжить, будет ли выполняться совет до/после?

4b9b3361

Ответ 1

С помощью этого теста

@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);
    }
}

у меня есть следующий вывод

  1. примерно до исполнения (void aspect.TestAspect.hello())
  2. перед выполнением (void aspect.TestAspect.hello())
  3. привет
  4. после выполнения (void aspect.TestAspect.hello())
  5. примерно после выполнения (void aspect.TestAspect.hello())
  6. примерно до исполнения (void aspect.TestAspect.hello())
  7. примерно после выполнения (void aspect.TestAspect.hello())

так что вы можете видеть, что до/после не вызывается, когда continue вызывается из аннотации @Around.

Ответ 2

Очередь: 2) Если мой совет вокруг не будет звонить, продолжите ли, совет до/после будет выполнен в любом случае?

Ответ: Если вы не вызываете продолжить в вашем круговом совете, ваш совет до, а также выполнение вашего кода будут пропущены, но ваш совет после выполнится. Но если ваш совет после использования какого-либо значения из этого метода, все будет нулевым. Так что на практике нет никакого смысла использовать этот совет вообще...

Надеюсь, я помог.