版权声明:博客知识产权来源命运的信徒,切勿侵权 https://blog.csdn.net/qq_37591637/article/details/85114762
知识点介绍
在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域.
默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域
demo如下
package cn.com.day03;
public class Address {
private String add;
private String id;
public void setAdd(String add) {
this.add = add;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "Address [add=" + add + ", id=" + id + "]";
}
public Address() {
// TODO Auto-generated constructor stub
System.out.println("address constructor....");
}
}
<!-- bean的作用域 -->
<bean id="a2" class="cn.com.day03.Address" p:add="anhui" p:id="1203" scope="singleton"></bean>
测试类如下
package cn.com.day03;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMain {
public static void main(String[] args) {
//1.创建ioc容器
ApplicationContext cox=new ClassPathXmlApplicationContext("AutoWire.xml");
//2.获取bean
Address c1=(Address) cox.getBean("a2");
Address c2=(Address) cox.getBean("a3");
System.out.println(c1);
System.out.println(c2);
}
}
结果如下
在视频上,老师说scope="singleton"是创建单实例的,在初始化容器的时候,就开始初始化bean了;后来就使用一个就可以了;
但是我给出来的是3个构造器打印结果,这个是为什么呢》
因为我的bean配置文件里面有三个Address类型的bean配置,初始化容器的时候,就会调用三次构造器方法;
但是对于同一个配置如bean名称是a2的,a2构造器只会创建一次,以后每次关于a2的,都会使用一个,不会再多创建了
我获取两个a2的bean名称
package cn.com.day03;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMain {
public static void main(String[] args) {
//1.创建ioc容器
ApplicationContext cox=new ClassPathXmlApplicationContext("AutoWire.xml");
//2.获取bean
Address c1=(Address) cox.getBean("a2");
Address c2=(Address) cox.getBean("a2");
System.out.println(c1);
System.out.println(c2);
}
}
控制台结果如下
scope="prototype"
配置文件如下
<bean id="a2" class="cn.com.day03.Address" p:add="anhui" p:id="1203" scope="prototype"></bean>
测试类如下;
package cn.com.day03;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMain {
public static void main(String[] args) {
//1.创建ioc容器
ApplicationContext cox=new ClassPathXmlApplicationContext("AutoWire.xml");
//2.获取bean
Address c1=(Address) cox.getBean("a2");
Address c2=(Address) cox.getBean("a2");
System.out.println(c1);
System.out.println(c2);
}
}
结果如下
原型的作用域,在初始化的 不会创建bean的,每一次调用都会重新创建一个
但是
为什么是4个呢?不应该是2个么?
因为我的配置文件里面有三个Address类型的bean配置,我只设置了a2是原型的,其他还是单个示例的
所以在创建容器的时候,另外两个单个示例的会调用构造器,打印出两条信息;
然后原型的不会打印;
在调用两次a2的时候,单个示例不会打印信息了,而原型的每调用一次就打印一次信息,总共2次。
所以控制台信息是4条!