2

弹簧参考手册说:

Spring 单例的范围最好描述为“每个容器和每个 bean”。

考虑这个代码片段:

ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml")
MyBean myobj=(MyBean)context.getBean("myBean"); //myBean is of singleton scope.
MyBean myobj1=(MyBean)context.getBean("myBean");

per container意味着如果我们执行context.getBean("myBean");两次,它将返回相同的 bean,即myobj==myobj1is true

但是per beanin per container and per beanfrom 上面的语句是什么意思?

4

3 回答 3

4

以简单的方式

ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml")
MyBean myobj=(MyBean)context.getBean("myBean"); //myBean is of singleton scope.

ApplicationContext context1= new ClassPathXmlApplicationContext("Beans.xml")
MyBean myobj1=(MyBean)context1.getBean("myBean");

myobj==myobj1 would not be same
于 2012-07-24T13:06:31.433 回答
3

Spring bean 容器将为单例范围的 bean 创建单个 bean,如果您有另一个 spring 容器,则将创建不同的 bean

所以每个容器都会有一个bean实例(对于单例范围的bean)

于 2012-07-24T12:40:15.187 回答
0

关于这个问题,我问了另一个问题:spring singleton scope- per container per bean

从那我得出以下per bean部分短语per container per bean

考虑:

ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml")
MyBean myobj=(MyBean)context.getBean("myBean"); 
MyBean myobj1=(MyBean)context.getBean("myBean"); 
MyBean myobj2=(MyBean)context.getBean("mySecondBean");

Beans.xml:

<bean id="myBean" class="MyBean"/>
<bean id="mySecondBean" class="MyBean"/>

现在 Spring 中的 Singleton 是per container per bean.

per container意味着如果我们在同一个容器中获得相同的 bean id,那么它们代表相同的实例 。因此是真的。getBean()myobj==myobj1

如果我们在两个不同的容器中获得具有相同 id 的 bean,那么它们将代表两个不同的实例。这在上面由NirmalthInk beYond给出的答案中表示。

但是对于单例,per container它也应该是per bean(每个 bean 标签)。

即,如果我们在同一个类的配置文件中定义两个bean,那么即使在同一个容器中,它们也代表不同的实例

这就是为什么myobj==myobj2是假的。

于 2012-10-17T05:39:51.317 回答