2012-05-27 65 views
0

通過編寫匹配方法的所有執行的切入點,我感到困惑。我想,應該匹配Alpha類的所有方法,執行的切入點:與下面的類層次結構帶繼承的切入點混淆

public class Alpha { 
    public void alphaMethod() {...} 
} 
public class Beta extends Alpha { 
    public void betaMethod() { 
     alphaMethod(); 
    } 
} 

execution(* Alpha.*(..)) 

如果主程序上Beta呼籲alphaMethod -instance我的建議是所謂的預期,但主程序調用betaMethod,也稱爲alphaMethod裏面我的建議是不叫,我不明白爲什麼。

看點清晰度

@Aspect 
public class MyAspect { 
    @Before(value = "execution(* Alpha.*(..))", argNames="joinPoint") 
    public void myAdvice(JoinPoint joinPoint) { 
     System.out.println("BEFORE: " + joinPoint.getSignature()); 
    } 
} 

主方法

Beta beta = ...; 
beta.alphaMethod(); //advice is called 
beta.betaMethod(); //advice is NOT called. 

回答

1

這是預期。

Spring AOP使用代理類來包裝建議的bean。當您從Beta方法中調用alphaMethod()時,代理甚至不知道它。

有關更多信息,請參閱this答案。

+0

我仍然不期待這種行爲,但使用代理導致此問題。謝謝! – thomas

+0

@darrengorman有沒有辦法告訴Spring將繼承的方法包含在內? –

1

正如已經回答的那樣,原因很明顯。你可以通過使用加載時編織而不是代理來解決這個問題(我想它歸結爲某個地方的配置選項和對AspectJ的依賴關係,如果還沒有依賴它的話),或者將bean作爲依賴項注入自身,然後實施

public void betaMethod() { 
    selfBean.alphaMethod(); 
} 

這工作,因爲selfBean不是同一基準this,前者是對代理的引用,後者原來,代理對象的引用。

+0

是的,使用「selfBean」引用會有所幫助,但這是一種我不感興趣的解決方法。但我會仔細研究織造設置。謝謝! – thomas