Java spring单例示波器
Spring参考手册上说: Spring单例的范围最好描述为“每个容器和每个bean” 考虑以下代码片段:Java spring单例示波器,java,spring,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("
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml")
MyBean myobj=(MyBean)context.getBean("myBean"); //myBean is of singleton scope.
MyBean myobj1=(MyBean)context.getBean("myBean");
每个容器
意味着如果我们执行context.getBean(“myBean”)
两次返回相同的bean,即myobj==myobj1
为true
但是上面语句中的
每个容器和每个bean中的每个bean
意味着什么?SpringBean容器将为单例范围的bean创建单个bean,如果您有另一个Spring容器,则会创建不同的bean
所以每个容器都会有一个bean实例(对于单例范围的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
关于这个问题,我问了另一个问题:
从这一点出发,我总结了短语中的每个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"/>
现在春天的单例是每个容器每个bean
per container
意味着如果我们在同一个容器中通过getBean()
获得相同的bean id,那么它们代表相同的实例。因此myobj==myobj1
是真的
如果我们在两个不同的容器中得到具有相同id的bean,那么它们将代表两个不同的实例
但是对于singleton,在每个容器的中,它也应该是每个bean的(每个bean标记)
i、 如果我们在同一类的配置文件中定义了两个bean,那么即使在同一个容器中,它们也表示不同的实例
这就是为什么myobj==myobj2
为假。你所说的“myobj==myobj1不一样”是什么意思?这两个都是同一个对象,所以它们是==
@Tichodroma:实际上,他的意思是myobj==myobj1是假的。@Tichodroma:是的,myobj==myobj1为false意味着myobj和myobj1不是同一个bean,因此请参见同一作者的另一个问题,u已经描述了每个容器每个容器和每个bean的部分短语,即单个bean仍然是每个容器的单个bean
。但是每个bean的在短语每个容器和每个bean的中表示什么呢?或者我只是混淆了短语的语言。如果您配置了同一个类的2个bean,那么容器中会有2个该类的实例,因为定义了两个bean