2010-11-08 78 views
2

假設有如下定義海灘:春豆範圍原型

<bean id="singletonBean" class="..."> 
    <property name="instanceBean" ref="instanceBean"/> 
</bean> 

<bean id="instanceBean" class="..." scope="prototype"/> 

當我打電話:

singletonBean = context.getBean("singletonBean"); 

...some code... 

singletonBean = context.getBean("singletonBean"); 

將財產singletonBeaninstanceBean重新初始化或者它只是使用已經創建的單?

回答

4

只會使用已經創建的單身人士。

每次從上下文獲取單例時,單例的原型內部bean將不會被重新創建。單身人士和全部是參考文獻是爲所有人創建的。

context.getBean("instanceBean");會給你一個新的範圍,因爲範圍是'原型'。

0

instanceBean在啓動時只設置一次,所以如果您願意,您可以通過singletonBean.getInstanceBean()得到instanceBean

0

當被調用時context.getBean("singletonBean")總是包含相同的instanceBean實例,儘管在bean定義中作用域爲prototype

相反,如果容器bean的範圍是prototype,並且它指的是一個定義範圍爲singleton的bean,那麼內部bean總是單例。例如: -

<bean id="outer" class="OuterBean" scope="prototype"> 
    <property name="innerBean" ref="inner" /> 
</bean> 
<bean id="inner" class="InnerBean" scope="singleton"/> 

OuterBean outer1 = (OuterBean) context.getBean("outer"); 
OuterBean outer2 = (OuterBean) context.getBean("outer"); 

這裏既有outer1outer2將包含InnerBean相同的實例。

在多頭環境中,如果innerBean包含任何共享數據,則可能導致競爭條件。