2011-11-03 26 views
1

這是Spring documentation,第9.5.4節春天引用protoyype豆與裁判在ProxyFactryBean是

<bean id="myAdvisor" class="com.mycompany.MyAdvisor"> 
    <property name="someProperty" value="Custom string property value"/> 
</bean> 

<bean id="debugInterceptor"class="org.springframework.aop.interceptor.DebugInterceptor"> 
</bean> 

<bean id="person" 
    class="org.springframework.aop.framework.ProxyFactoryBean"> 
    <property name="proxyInterfaces" value="com.mycompany.Person"/> 

    <property name="target" ref="personTarget"/> 
    <property name="interceptorNames"> 
     <list> 
      <value>myAdvisor</value> 
      <value>debugInterceptor</value> 
     </list> 
    </property> 
</bean> 

現在,代碼下面的註釋說:

您可能想知道爲什麼列表 不包含bean引用。原因是如果 ProxyFactoryBean的singleton屬性設置爲false,它必須能夠 返回獨立的代理實例。如果任何顧問本身是 原型,則需要返回一個獨立實例 ,因此需要能夠從工廠獲得原型 的實例;舉辦參考是不夠的。

有人可以請解釋這是如何工作的。我知道各種範圍。所以我知道,如果顧問是原型,那麼需要返回一個新實例。但我沒有得到最後的聲明(以粗體突出顯示)。如果我指定ref="debugInterceptor",bean的創建機制會改變嗎?這是否意味着如果我的ref是一個bean,它將是一個單例實例。

回答

0

這是否意味着如果我參考一個bean,它將是一個單例實例。

不,但被引用的bean將在引用bean實例化時被實例化。如果Bean A(單例作用域)對Bean B(原型範圍)有ref,那麼Bean B將被創建並注入到Bean A中。就Bean A而言,Bean B 是一個單身人士,爲

ProxyFactoryBean必須包含bean名稱列表,以便在創建ProxyFactoryBean本身時不強制對攔截器進行解引用。通過保存一個名稱列表,它可以推遲攔截器的查找直到最後一分鐘,允許攔截器成爲原型範圍的bean。

這是否幫助?