簡體   English   中英

春季AOP:明智地選擇建議

[英]Spring AOP: Choosing advice seletively

我有兩個建議類,它們實現了MethodInterceptor。 我想將這些建議應用於一個切入點表達,並在調用目標方法時選擇建議。

我認為這是不可能的,所以我做了一個目標類的子類,並為子類使用了切入點表達。

類看起來像:

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()通過方法SubClass ,也許是因為有中沒有實現的方法SubClass 當我重寫getZero()方法時它起作用了,但是我不想重寫它,因為實際的SuperClass有太多的方法,如果我想調用SuperClass的方法,那是多余的。

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

您關於它的理論不起作用是因為您沒有在子類中實現/重寫它。 切入點指定了子類中定義的方法的所有執行,並且沒有在類中實際定義的任何方法,因此您將沒有任何匹配的連接點。

我從您的問題中不確定是否要匹配所有子類的方法執行,還是只匹配在超類上定義但在子類的實例上調用的方法。 如果您詢問前者,則可能要使用此切入點:

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

添加的加號選擇了SuperClass的所有子類型,因此您的切入點現在選擇了SuperClass或其子類中定義的所有方法的所有執行。 在此處查看AspectJ參考以獲取有關子類型模式的更多信息。

我發現我的方法是錯誤的。 我可以將建議僅應用於具有bean express的子類,如下所示:

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

但是我不需要為此創建一個子類。 我只需要再加上一個豆就可以應用其他建議。 總之,我可以通過制作多個bean來應用多個建議,並可以按bean名稱有選擇地選擇建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM