信息

2016-11-09 64 views
2

比方說,我們有以下2種方法的類:信息

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

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

而且我有一個建議,切入點都方法:

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

} 

如果您調用方法getA(),然後切入點一次
而當我調用方法getAB()時,則切入點將被調用兩次,因爲此方法還需要在內部調用getA()
什麼我想是隻調用建議一次當您調用方法getAB()。可能嗎?我不想將建議分成兩個建議,因爲我有數百種方法,其中許多方法都會調用對方。

回答

4

我想你在這裏需要的是cflowbelow(...)。從AspectJ documentation

cflowbelow(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); 
}