2012-08-12 73 views
10

Spring DocumentationSpring AOP的靶標()與此()

  • 任意連接點(方法執行僅在Spring AOP),其中所述代理 實現了AccountService接口:

    this(com.xyz.service.AccountService) 
    
  • 目標 對象實現AccountService接口的任何連接點(僅在Spring AOP中執行方法):

    target(com.xyz.service.AccountService) 
    

我不明白什麼是「目標對象」,並表達target(...)意思。

targetthis有什麼不一樣?

回答

17

this(AType)表示this instanceof AType爲真的所有連接點。所以這意味着在你的情況下,一旦呼叫達到帳戶服務this instanceof AccountService的任何方法將是真實的。

target(AType)表示所有連接點,其中anObject instanceof AType。如果您在對象上調用方法,並且該對象是AccountService的實例,那將是有效的連接點。

總結以不同的方式 - this(AType)是從接收器的角度來看,和target(AType)是從呼叫者角度。

+0

如果我得到你的權利......既'this'和'target'做同樣的事情???一旦我的代碼試圖執行'AccountService'的某種方法,那麼從接收者的角度來看,'AccountService的這個實例'是真實的;並且從調用者的角度來看,'calledObject instanceof AccountService'也是如此。那麼爲什麼這種冗餘呢? – rapt 2012-08-12 21:27:51

+0

它在AspectJ中很重要,但在Spring AOP中你沒有那麼多 - 因爲'call'(通常與target一起使用)將編織調用者,而'execution'(與此一起)將編織類本身。這很重要,因爲像編譯時編織一樣,您可能無法訪問第三方類來使用執行進行編織,然後可以將調用編織到第三方庫。 – 2012-08-12 21:34:06

+0

謝謝你的解釋。 – rapt 2012-08-13 02:21:38

9

我知道這是一箇舊帖子,但我只是遇到了這個和目標之間的重要區別,而不使用AspectJ。

請看下面的介紹方面:

@Aspect 
public class IntroductionsAspect { 

    @DeclareParents(value="a.b.c.D", defaultImpl=XImpl.class) 
    public static X x; 

    @After("execution(* a.b.c.D.*(..)) && this(traceable)") 
    public void x(Traceable traceable) { 
     traceable.increment(); 
    } 

} 

簡單地說,這方面是做兩件事情:

  1. 使得a.b.c.D類實現X接口。
  2. 在每個方法a.b.c.D之前添加要調用的traceable.increment()

重要的部分是"execution(* a.b.c.D.*(..)) && this(traceable)"。請注意,我使用這個,而不是目標

如果使用目標相反,你要匹配的原班a.b.c.D,而不是被引入接口X。所以Spring AOP在a.b.c.D中找不到任何連接點。

總結:

- 檢查代理類型,或引入類型。 目標 - 檢查聲明的類型。

+0

好點,謝謝 – 2014-03-10 22:39:25