Весенние бобы с прототипом - PullRequest
2 голосов
/ 08 ноября 2010

Предположим, у вас есть следующее определение пляжа:

<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 инициализироваться снова или оно будет просто использовать уже созданноесинглтон?

Ответы [ 3 ]

4 голосов
/ 08 ноября 2010

Будет просто использовать уже созданный синглтон.

Прототипированный внутренний компонент синглтона не будет воссоздан каждый раз, когда вы получаете синглтон из контекста. Singleton и all являются ссылками , созданными один для всех.

Но context.getBean("instanceBean"); даст вам новое, поскольку область действия - «прототип».

0 голосов
/ 12 июля 2017

При вызове context.getBean("singletonBean") всегда он содержит один и тот же экземпляр instanceBean, хотя область действия prototype в определении компонента.

Напротив, если контейнерный компонент имеет область действия prototype и относится к компоненту, который определен с областью действия singleton, всегда внутренний компонент будет иметь значение 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, и outer2 будут содержать один и тот же экземпляр InnerBean.

В многопоточной среде, если innerBean содержит какие-либо общие данные, это может привести к состоянию гонки.

0 голосов
/ 08 ноября 2010

instanceBean устанавливается только один раз при запуске, поэтому вы можете получить instanceBean на singletonBean.getInstanceBean(), если хотите.

...