2012-05-11 51 views
1

我有兩個實現MethodInterceptor的建議類。我希望將這些建議應用於一個切入點表達式,並在我調用目標方法時選擇建議。Spring AOP:選擇建議

我認爲這是不可能的,所以我做了一個目標類的子類,並使用pointcut表示子類。

類的樣子:

class SuperClass implements SomeInterface { 
    public int getZero() { 
     return 0; 
    } 
} 

class SubClass extends SuperClass implements SomeInterface { 
} 

和XML的樣子:

<bean id="subAdvice" class="package.SomeAdvice" /> 
<aop:config> 
    <aop:advisor advice-ref="subAdvice" pointcut="execution(* *..SubClass.*(..))"/> 
</aop:config> 

subAdvice因爲有在​​沒有實現的方法不適用的情況我通過​​叫getZero()方法,也許。當我重寫getZero()方法時它有效,但我不想重寫它,因爲實際SuperClass中有太多方法,如果我想調用SuperClass的方法,這是多餘的。

我可以將建議應用於未實現方法的子類嗎?或者還有其他的選擇性建議的好方法嗎?

回答

0

我發現我的方法是錯誤的。我可以申請的建議只是與bean快遞這樣的子類:

<bean id="subAdvice" class="package.SomeAdvice" /> 
<aop:config> 
    <aop:advisor advice-ref="subAdvice" pointcut="bean(subClass)"/> 
</aop:config> 

但我沒有需要爲一個子類。我需要的只是另一個bean來應用其他建議。總之,我可以通過製作多個bean並通過bean名稱選擇建議來應用多個建議。

1

你的理論關於它不工作,因爲你沒有在你的子類中實現/覆蓋它是正確的。你的切入點指定了在子類中定義的所有方法的執行,並且沒有在類中實際定義的任何方法,你將不會有任何匹配的連接點。

我不確定你的問題是你想匹配所有的子類的方法執行還是隻匹配在超類上定義的子類,但是調用子類的一個實例。如果你問的是前者,你可能想用這個切入點:

execution(* package.SuperClass+.*(..)) 

增加的加檢出超類的所有亞型,所以你現在的切入點選擇的超類或它的子類中定義的所有方法的所有執行。查看AspectJ參考here以獲取有關子類型模式的更多信息。

+0

'我不確定你的問題是你想匹配所有的子類的方法執行還是隻匹配超類上定義的,但是調用子類的一個實例。「我想要的是後者:( –

+0

你是否在乎你的建議是否適用於超類? – blackdog6621

+0

我不想將這些建議應用於超類,並且我發現瞭如何做到這一點,請參閱我的答案,謝謝你的幫助! –