spring singleton scope



Spring参考手册上说:

Spring singleton的作用域最好用"每个容器和每个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==myobj1true

但从上面的陈述来看,per container and per bean中的per bean是什么意思呢?

以简单的方式

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

Spring bean容器将为singleton作用域的bean创建单个bean,如果您有另一个Spring容器,则会创建不同的bean

因此,每个容器将有一个bean实例(对于单例作用域的bean)

关于这个问题,我问了另一个问题:spring singleton scope——每个容器每个bean

据此,我为短语per container per beanper 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"/>

现在《春天的辛格尔顿》是per container per bean

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

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

但对于singleton,在per container中,它也应该是per bean(每个bean标记)。

即,如果我们在同一类的配置文件中定义两个bean,则它们表示不同的实例,即使在同一容器中也是如此。

这就是myobj==myobj2为假的原因。

最新更新