bean作用域与懒加载
bean作用域有:
- singleton:默认单例,也就是每次去IOC容器拿同一个名称的bean,返回的都是同一份
- prototype:多例,每次去拿,IOC容器都为我们新建一个实例
- request:每个请求创建一个bean,在web环境下使用(几乎不用)
- session:每个session创建一个bean,在web环境下使用(几乎不用)
可能大家都知道默认的bean为单例模式,那这么bean是什么时候被创建出来的呢?是IOC容器被创建的时候就创建这个bean,还在这个bean第一次使用的时候被创建?下面我们来测试一下
House类:
public class House {
private String name;
private int area;
public House(String name, int area) {
this.name = name;
this.area = area;
}
@Override
public String toString() {
return "House{" +
"name='" + name + '\'' +
", area=" + area +
'}';
}
}
bean配置类:
@Configuration
public class AnnotationBeanConfig {
// @Scope("prototype")
// @Lazy
@Bean("house")
public House house01() {
System.out.println("===> House bean created...");
return new House("prince chen", 130);
}
}
测试类:
public class AnnotationBeanTest {
@Test
public void testBeanScope() {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AnnotationBeanConfig.class);
System.out.println("===> IoC container was created....");
}
}
这里我们先只创建IOC容器,并不获取bean,结果:
===> House bean created...
===> IoC container was created....
我们可以看到,默认单例模式下在IOC容器被创建时,这些单例的bean就被创建了
为了证明拿的是同一份bean,我们在测试方法加上如下,可以看到打印为true,也就是多次拿,给我们都是同一份bean,并没有重新为我们new一个新的
@Test
public void testBeanScope() {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AnnotationBeanConfig.class);
System.out.println("===> IoC container was created....");
House house = (House) applicationContext.getBean("house");
House house2 = (House) applicationContext.getBean("house");
System.out.println(house==house2);
}
那多例模式下呢?我们在house这个bean上增加@Scope(“prototype”),结果:
===> IoC container was created....
也就是在多例模式下,IOC容器创建的时候并没有把bean创建了,我们修改测试方法:
@Test
public void testBeanScope() {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AnnotationBeanConfig.class);
System.out.println("===> IoC container was created....");
House house = (House) applicationContext.getBean("house");
House house2 = (House) applicationContext.getBean("house");
System.out.println(house==house2);
}
结果:可以看到,每次我们获取这个bean,spring都为我们new一个新的
===> IoC container was created....
===> House bean created...
===> House bean created...
false
单例模式下我们不想在创建创建IOC容器的时候就创建每个单例的bean,怎么办?
OK,没问题~
我们只要在bean上加这个注解@lazy,那么IOC容器在创建的时候就不会去创建单例的bean,而是在我们第一次去取这个bean的时候被创建,这就是bean的懒加载。
另外两个作用域在web环境下使用,这里就不再测试,大家自行学习~