有关以前建议的建议中的信息

时间:2016-11-09 00:36:45

标签: java aop aspectj spring-aop

我们假设我们有一个课程,有以下两种方法:

public String getA() {
    return "A";
}

public String getAB() {
    return getA() + "B";
}

我建议切入两种方法:

@Before(...)    
public void beforePointCut() {

}

如果您调用方法getA(),则会调用切入点一次
当我调用方法getAB()时,会调用切入点两次,因为此方法也需要在内部调用getA()
我想要是在调用方法getAB()时仅调用一次的建议。可能吗?我不想将建议分成两个建议,因为我有数百种方法,其中许多方法互相调用。

1 个答案:

答案 0 :(得分:4)

我认为你需要的是cflowbelow(...)。来自AspectJ documentation

  

cflowbelow(Pointcut):在Pointcut选择的任何连接点P的控制流中选出每个连接点,但不是P本身。

您需要将!cflowbelow(beforePointcut())添加到切入点表达式,类似于:

@Pointcut("execution(* YourClass.get*(..))")
public void beforePointcut() {}

@Pointcut("beforePointcut() && !cflowbelow(beforePointcut())")
public void beforePointcutOnlyOnce() {}

@Before("beforePointcutOnlyOnce()")
public void beforeAdvice(JoinPoint joinPoint) {
    System.out.println("before " + joinPoint);
}