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==myobj1
是true
。
但从上面的陈述来看,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 bean
的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"/>
现在《春天的辛格尔顿》是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
为假的原因。