31

假设您有三个建议:aroundbeforeafter

1)在周围建议中调用proceed时是在调用之前/之后,还是整个周围建议之前/之后调用它们?

2)如果我的周围建议没有调用继续之前/之后的建议是否会运行?

4

2 回答 2

43

有了这个测试

@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())

因此,当从注释中调用继续时,您可以看到之前/之后没有被调用。@Around

于 2013-08-05T09:21:24.927 回答
0

Que:2)如果我的周围建议没有调用继续,之前/之后的建议是否会运行?

回答:如果你没有在你的周围建议中调用继续,你的之前的建议以及你的代码执行将被跳过,但你的之后的建议将被执行。但是如果你的之后的建议使用该方法中的任何值,那么一切都将为空。所以实际上根本没有使用该建议的意义...

希望,我帮助了。

于 2018-08-13T10:42:22.317 回答