2010-08-15 31 views

回答

44

ProxyFactoryBean用於將攔截器邏輯應用於現有的目標bean,以便在該bean的方法被調用時,攔截器在該方法調用之前和之後執行。這是面向方面編程(AOP)的一個例子。

這可以用一個簡單的例子來解釋。 AOP的經典用例是將緩存應用於方法調用的結果。這可以通過使用ProxyFactoryBean進行接線如下:

<bean id="targetService" class="com.x.MyClass"/> 

<bean id="cachingInterceptor" class="com.x.MyCachingInterceptor"/> 

<bean id="cachedService" class="org.springframework.aop.framework.ProxyFactoryBean"> 
    <property name="target" ref="targetService"/> 
    <property name="interfaces"> 
     <list>    
      <value>com.x.MyService</value> 
     </list> 
    </property> 
    <property name="interceptorNames"> 
     <list> 
      <value>cachingInterceptor</value> 
     </list> 
    </property> 
</bean> 

我們有com.x.MyClass類型,它實現了接口com.x.MyService的豆targetService。我們也有一個名爲cachingInterceptor的攔截器bean,它實現了接口org.aopalliance.intercept.MethodInterceptor

該配置將生成一個名爲cachedService的新bean,它實現了MyService接口。任何對該對象方法的調用都將首先通過cachingInterceptor對象的invoke()方法傳遞,在這種情況下,該方法將在其內部緩存中查找以前方法調用的結果。它會返回緩存的結果,或允許方法調用繼續執行targetService上適當的方法。

targetService本身對此一無所知,它完全沒有意識到所有這些AOP事情正在進行。

ProxyFactoryBean在Spring內部大量使用,以便由於各種原因(例如遠程存根,事務管理)生成代理,但它也非常適合在應用程序邏輯中使用。

+0

在這裏添加一件事就是,如果我們有幾個'interceptorNames',它們按照這樣的順序應用,那麼列表中的第一個是第一個攔截調用等等。 – Vic 2013-11-04 11:40:22

6

ProxyFactoryBean將方面應用於現有的bean。您從現有的bean(目標bean)開始,它彈出「包裝」以添加您提供的方面。返回的bean與原始bean具有相同的接口,但是具有圍繞目標bean方法編寫的附加方面。

相關問題