2012-10-02 18 views
0

我碰到下面的Spring AOP的切入點在教程中傳來:下面的切入點是否有效?

execution(public * * (..)) 

有人說,這將導致所有的公共方法的執行。那是對的嗎? AFAIK我們只能攔截公共方法,而公開的關鍵字甚至是非法的。

+0

pointcut:指定符(返回類型,package.type.method(params)) –

回答

3

除了@馬里奧的回答,spring docs on AOP說以下內容(重點雷):

注意由於Spring的AOP框架的基於代理的性質, 保護的方法是通過定義不攔截,既不是JDK 代理(其中,這是不適用),也不是CGLIB代理(其中 這在技術上是可行的,但不適用於AOP目的)。因此,任何給定的切入點將僅與公開的 方法匹配!

如果您的攔截需求包括受保護/私有方法或構造函數,則考慮使用Spring驅動的本機AspectJ編織 而不是Spring的基於代理的AOP框架。這構成了具有不同特徵的AOP使用的不同模式,因此請確保 在做出決定之前先熟悉編織。

此外,切入點語法如下:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? 
      name-pattern(param-pattern) throws-pattern?) 

Wherby的modifier-patternpublicprotected等,但可選...

1

是的,它似乎是一個有效的切入點,它完全符合他所說的。

此外,值得注意的是,用「保護」取代「公共」關鍵字是完全合法的,它仍然有效!奇怪的是,它也適用於「私有」方法... (使用Spring 3.1.2 + AspectJ 1.6.9進行測試)

據我所知,CGLib代理可用於代理受保護的方法,但它們是有效的只有當它們是從不同的對象實例中調用時。因此,從技術上講,應該可以像公衆一樣完全忠告受保護的方法。

(據報道由@ beny23 advicing保護/私有方法不使用Spring AOP代理實現的工作,但只能用彈簧驅動AspectJ織)

0

切入點:designator(modifier returnType package.type.method(params))你的情況

execution(public * * (..)) 

將爲所有公共方法執行,任何返回類型在項目中具有0到多個參數