我们假设我们有一个课程,有以下两种方法:
public String getA() {
return "A";
}
public String getAB() {
return getA() + "B";
}
我建议切入两种方法:
@Before(...)
public void beforePointCut() {
}
如果您调用方法getA()
,则会调用切入点一次。
当我调用方法getAB()
时,会调用切入点两次,因为此方法也需要在内部调用getA()
。
我想要是在调用方法getAB()
时仅调用一次的建议。可能吗?我不想将建议分成两个建议,因为我有数百种方法,其中许多方法互相调用。
答案 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);
}