2016-08-12 79 views
0

考慮當prototype作用域的bean被注入到一個單範圍的bean的情況下,如何範圍代理內部工作在春季

,當我們試圖使用Singleton作用域的bean來訪問原型作用域的bean,我們每次都返回相同的bean,即在singleton初始化時注入的bean。

如果我們想在每次使用作用域代理時獲得不同的實例。

我沒有得到這個範圍代理如何在舞臺後工作的概念,以及它如何神奇地給我們一個新的實例,即使這個bean存在於一個單例中。

回答

0

來自:http://docs.spring.io/spring/docs/2.5.x/reference/beans.html#beans-factory-scopes-other-injection

能夠定義一個bean作用域爲HTTP請求或Session(甚至你自己設計的自定義範圍)都非常好,但對主要的一個值,加上Spring IoC容器不僅可以管理對象(bean)的實例化,還可以管理協作者(或依賴項)的連接。如果您想要將(例如)HTTP請求範圍的bean注入另一個bean,則需要注入一個AOP代理來代替範圍的bean。也就是說,您需要注入一個代理對象,該對象公開與作用域對象相同的公共接口,但它足夠聰明,能夠從相關作用域(例如HTTP請求)和委託方法中檢索真實的目標對象調用真正的對象。要創建這樣的代理,只需要將一個子元素插入到一個有作用域的bean定義中(您可能還需要在您的類路徑上使用CGLIB庫,以便容器可以實現基於類的代理;您還需要使用附錄A,基於XML模式的配置)。那麼,爲什麼你需要這個元素來定義bean的請求範圍,session,globalSession和'在這裏插入你的自定義範圍'級別?究其原因,最好通過挑選除了下面bean定義解釋(請注意,因爲它代表了下面一個userPreferences bean定義是不完整):

<bean id="userManager" class="com.foo.UserManager"> 
     <property name="userPreferences" ref="userPreferences"/> 
    </bean> 
    <bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/> 

    <bean id="userManager" class="com.foo.UserManager"> 
     <property name="userPreferences" ref="userPreferences"/> 
    </bean> 
+0

是不是清楚了嗎? – pacman