spring注解开发——bean的作用域和懒加载

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一个新的

扫描二维码关注公众号,回复: 11639279 查看本文章
===> IoC container was created....
===> House bean created...
===> House bean created...
false

单例模式下我们不想在创建创建IOC容器的时候就创建每个单例的bean,怎么办?

OK,没问题~

我们只要在bean上加这个注解@lazy,那么IOC容器在创建的时候就不会去创建单例的bean,而是在我们第一次去取这个bean的时候被创建,这就是bean的懒加载。

另外两个作用域在web环境下使用,这里就不再测试,大家自行学习~

猜你喜欢

转载自blog.csdn.net/chenshufeng115/article/details/100050254