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、广告
-
码云点star,万分感谢!
代码已经上传到码云了
https://gitee.com/geekerdream/spring-anonation
通用的权限处理框架
https://gitee.com/geekerdream/common-security
通用的异常处理
https://gitee.com/geekerdream/exception-handler
通用的发送邮件
https://gitee.com/geekerdream/common-boot-email
陆续会推出更多干货,希望关注!
-
QQ群【Java初学者学习交流群】:458430385
-
微信公众号【Java码农社区】
![](https://img.haomeiwen.com/i4582242/ca4a357ae859b1aa.jpg)
- 今日头条号:编程界的小学生
网友评论