AspectJ“围绕”和“继续”与“之前/之后”

时间:2013-08-02 12:07:03

标签: java aop aspectj

我们假设你有三个建议:围绕之前之后

1)在围绕建议中调用继续时,之前/之后被调用, 或者他们在整个围绕建议之前/之后被称为

2)如果我的围绕建议没有致电继续, 是否会运行之前/之后建议?

2 个答案:

答案 0 :(得分:38)

使用此测试

@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 aspects.TestAspect.hello())
  2. 执行前(void aspects.TestAspect.hello())
  3. in hello
  4. 执行后(void aspects.TestAspect.hello())
  5. 执行后
  6. 在周围(void aspects.TestAspect.hello())
  7. 在执行前(void aspects.TestAspect.hello())
  8. 执行后
  9. 在周围(void aspects.TestAspect.hello())
  10. 所以你可以看到之前/之后不被称为

答案 1 :(得分:0)

问题:2)如果我的周围建议未致电进行,那么之前/之后建议是否仍会运行?

回答:如果您不调用周围的建议,则会跳过之前的建议和代码执行,但会执行之后的建议。但是,如果您的之后的建议使用该方法中的任何值,则所有内容为null因此,实际上根本没有必要使用该建议...

希望,我帮了忙。