弹簧单体范围

时间:2012-07-24 12:37:44

标签: java spring

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==myobj1true

但是,per beanper container and per bean来自上述陈述是什么意思?

3 个答案:

答案 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是假的。