Spring参考手册说:
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==myobj1
为true
。
但是,per bean
中per container and per bean
来自上述陈述是什么意思?
答案 0 :(得分: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
答案 1 :(得分:3)
Spring bean容器将为单例作用域bean创建单个bean,如果你有另一个spring容器,那么将创建不同的bean
所以每个容器都会有单个bean实例(对于单例范围的bean)
答案 2 :(得分: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
表示如果我们在同一容器中通过getBean()
获得相同的bean ID ,则它们代表相同的实例。因此myobj==myobj1
是的。
如果我们在两个不同容器中获得具有相同id的bean,那么它们将代表两个不同的实例。这在上面的回答中表示为 Nirmal- thInk beYond 。
但是对于单身人士,在per container
内,它也应该是per bean
(每个bean标签)。
即如果我们在同一类的配置文件中定义两个bean,那么它们代表不同的实例,即使在同一容器中也是如此。
这就是为什么myobj==myobj2
是假的。