Java springbeans与scope原型

Java springbeans与scope原型,java,spring,scope,javabeans,Java,Spring,Scope,Javabeans,假设有以下海滩定义: <bean id="singletonBean" class="..."> <property name="instanceBean" ref="instanceBean"/> </bean> <bean id="instanceBean" class="..." scope="prototype"/> singletonBean的属性instanceBean会被再次初始化吗?或者它只会使用已经创建的singleto

假设有以下海滩定义:

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

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

singletonBean
的属性
instanceBean
会被再次初始化吗?或者它只会使用已经创建的singleton?

instanceBean在启动时只设置一次,因此您可以通过
singletonBean.getInstanceBean()
获得
instanceBean
,如果您愿意的话

将只使用已经创建的单例

不会在每次从上下文获取单例时都重新创建单例的原型内部bean。singleton和all是引用是一对一创建的


但是
context.getBean(“instanceBean”)
将为您提供一个新的实例,因为作用域是“prototype”。

当调用
context.getBean(“singletonBean”)
时,它总是包含相同的
instanceBean实例,尽管在bean定义中作用域是
prototype

相反,如果容器bean是scope
prototype
,并且它引用了一个用scope
singleton
定义的bean,那么内部bean总是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");

OuterBean outer1=(OuterBean)context.getBean(“外部”);
OuterBean outer2=(OuterBean)context.getBean(“外部”);
这里,
outer1
outer2
都将包含
InnerBean
的相同实例

在多头环境中,如果
innerBean
持有任何共享数据,则可能导致竞争状况

<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");