AspectJ “around” 和 “continue” with “before/after”

2022-09-01 09:50:42

假设您有三个建议:周围之前之后

1)在周围建议中调用进行时,是在之前/之后调用,还是在周围建议作为一个整体调用之前/之后调用?

2)如果我的周围建议没有调用继续那么之前/之后的建议无论如何都会运行吗?


答案 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. 在执行之前(无效方面。TestAspect.hello())
  2. 在执行之前(无效方面。TestAspect.hello())
  3. 在你好
  4. 执行后(无效方面。TestAspect.hello())
  5. 在执行后左右(无效方面。TestAspect.hello())
  6. 在执行之前(无效方面。TestAspect.hello())
  7. 在执行后左右(无效方面。TestAspect.hello())

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


答案 2

Que:2)如果我的周围建议没有调用继续,那么之前/之后的建议无论如何都会运行吗?

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

希望,我帮助了。


推荐