Java 杂谈Java后端SSM

004Spring注解@Lazy

2018-07-03  本文已影响74人  编程界的小学生

1、简介

@Lazy指定单例bean的加载时机。

2、基础类

public class User {

    private String name;

    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

3、@Lazy

3.1、取值

true
false

3.2、默认值

true

3.3、讲解

3.3.1、概述

懒加载,也称延时加载。仅对单例Bean生效。单例Bean是在Spring容器启动的时候加载的,添加@Lazy注解后就会延迟加载,在Spring容器启动的时候并不会加载,而是在当你第一次使用此bean的时候才会加载,但当你多次获取bean的时候不会重复加载,只是在第一次获取的时候会加载,这不是延迟加载的特性,而是单例Bean的特性。

3.3.2、证明单例

3.3.2.1、配置类
@Configuration
public class MainConfig {

    /**
     * 懒加载:
     *  针对于单实例bean:默认在容器启动的时候创建对象;
     *  懒加载:容器启动先不创建对象,第一次使用Bean的时候在创建对象并初始化放到容器中。
     *
     * @return
     */
    @Lazy
    @Bean("user")
    public User user() {
        System.out.println("给容器中添加user....");
        return new User("张三", 28);
    }
}
3.3.2.2、测试类
public class LazyTest {

    @Test
    public void test01() {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        System.out.println("IOC容器创建完成......");
        User user1 = applicationContext.getBean("user", User.class);
        User user2 = applicationContext.getBean("user", User.class);
        System.out.println(user1 == user2);
    }

}
3.3.2.3、测试结果
IOC容器创建完成......
给容器中添加user....
true

PS:

结果分析:

首先我们发现:在创建容器的时候(创建完之前)并没有实例化各种scope为singleton的bean到容器中。然而是容器创建完,当获取这个bean的时候,才会创建对象,当第二次在继续获取这个对象的时候,不会继续创建bean,而是直接从容器中获取的,所以获取了两次都返回了同一个对象,所以对比地址返回true。

4、广告

img
上一篇 下一篇

猜你喜欢

热点阅读