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