假设有以下海滩定义:
<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");
instanceBean
的属性singletonBean
会再次初始化,还是仅使用已创建的单例?
答案 0 :(得分:4)
只使用已创建的单身人士。
每次从上下文获取单例时,都不会重新创建单例的原型内部bean。单身和所有是参考是为所有人创建的。
但是context.getBean("instanceBean");
会给你一个新的,因为范围是'原型'。
答案 1 :(得分:0)
instanceBean仅在启动时设置一次,因此如果您愿意,可以通过instanceBean
获取singletonBean.getInstanceBean()
。
答案 2 :(得分:0)
调用temp
时,它始终包含Stock
的相同实例,但bean定义中的范围为string Stock = string.Format("{0:G29}", decimal.Parse(Model.Stock.ToString()));
@Html.TextBoxFor(model => Stock)
。
相反,如果容器bean的范围是context.getBean("singletonBean")
,并且它引用了一个用范围instanceBean
定义的bean,那么内部bean总是单例。例如: -
prototype
此处prototype
和singleton
都包含<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");
的相同实例。
在多头环境中,如果outer1
包含任何共享数据,则可能导致竞争状况。