【Spring注解驱动开发】使用@Lazy注解实现懒加载
写在前面
Spring在启动时,默认会将单实例bean进行实例化,并加载到Spring容器中。也就是说,单实例bean默认在Spring容器启动的时候创建对象,并将对象加载到Spring容器中。如果我们需要对某个bean进行延迟加载,我们该如何处理呢?此时,就需要使用到@Lazy注解了。
项目工程源码已经提交到GitHub:https://github.com/sunshinelyz/spring-annotation
懒加载
懒加载就是Spring容器启动的时候,先不创建对象,在第一次使用(获取)bean的时候,创建并使用对象,大家是不是想到了在【设计模式】专题中的单例模式呢?对单例模式不太了解的同学可以猛戳《浅谈JAVA设计模式之——单例模式(Singleton)》,也可以查看《设计模式汇总——你需要掌握的23种设计模式都在这儿了!》来系统学习每种设计模式。
非懒加载模式
此时,我们将PersonConfig2类的配置修改成单实例bean,如下所示。
package io.mykit.spring.plugins.register.config;
import io.mykit.spring.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author binghe
* @version 1.0.0
* @description 测试@Scope注解设置的作用域
*/
@Configuration
public class PersonConfig2 {
@Bean("person")
public Person person(){
System.out.println("给容器中添加Person....");
return new Person("binghe002", 18);
}
}
接下来,在SpringBeanTest类中创建testAnnotationConfig5()方法,如下所示。
@Test
public void testAnnotationConfig5(){
ApplicationContext context = new AnnotationConfigApplicationContext(PersonConfig2.class);
System.out.println("IOC容器创建完成");
}
运行SpringBeanTest类中的testAnnotationConfig5()方法,输出的结果信息如下所示。
给容器中添加Person....
IOC容器创建完成
可以看到,单实例bean在Spring容器启动的时候就会被创建,并加载到Spring容器中。
懒加载模式
我们在PersonConfig2的person()方法上加上@Lazy注解将Person对象设置为懒加载,如下所示。
package io.mykit.spring.plugins.register.config;
import io.mykit.spring.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
/**
* @author binghe
* @version 1.0.0
* @description 测试@Scope注解设置的作用域
*/
@Configuration
public class PersonConfig2 {
@Lazy
@Bean("person")
public Person person(){
System.out.println("给容器中添加Person....");
return new Person("binghe002", 18);
}
}
此时,我们再次运行SpringBeanTest类中的testAnnotationConfig5()方法,输出的结果信息如下所示。
IOC容器创建完成
可以看到,此时,只是打印出了“IOC容器创建完成”,说明此时,只创建了IOC容器,并没有创建bean对象。
那么,加上@Lazy注解后,bean是何时创建的呢?我们在SpringBeanTest类中的testAnnotationConfig5()方法中获取下person对象,如下所示。
@Test
public void testAnnotationConfig5(){
ApplicationContext context = new AnnotationConfigApplicationContext(PersonConfig2.class);
System.out.println("IOC容器创建完成");
Person person = (Person) context.getBean("person");
}
此时,我们再次运行SpringBeanTest类中的testAnnotationConfig5()方法,输出的结果信息如下所示。
IOC容器创建完成
给容器中添加Person....
说明,我们在获取bean的时候,创建了bean对象并加载到Spring容器中。
那么,问题又来了,只是第一次获取bean的时候创建bean对象吗?多次获取会不会创建多个bean对象呢?我们再来完善下测试用例,在在SpringBeanTest类中的testAnnotationConfig5()方法中,再次获取person对象,并比较两次获取的person对象是否相等,如下所示。
IOC容器创建完成
给容器中添加Person....
true
从输出结果中,可以看出使用@Lazy注解标注后,单实例bean对象只是在第一次从Spring容器中获取对象时创建,以后每次获取bean对象时,直接返回创建好的对象。
总结
懒加载,也称延时加载。仅对单例bean生效。单例bean是在Spring容器启动的时候加载的,添加@Lazy注解后就会延迟加载,在Spring容器启动的时候并不会加载,而是在第一次使用此bean的时候才会加载,但当你多次获取bean的时候不会重复加载,只是在第一次获取的时候会加载,这不是延迟加载的特性,而是单例Bean的特性。
好了,咱们今天就聊到这儿吧!别忘了给个在看和转发,让更多的人看到,一起学习一起进步!!
项目工程源码已经提交到GitHub:https://github.com/sunshinelyz/spring-annotation
写在最后
如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习Spring注解驱动开发。公众号回复“spring注解”关键字,领取Spring注解驱动开发核心知识图,让Spring注解驱动开发不再迷茫。
【Spring注解驱动开发】使用@Lazy注解实现懒加载的更多相关文章
- iOS 开发——实用技术Swift篇&Swift 懒加载(lazy)
Swift 懒加载(lazy) 在程序设计中,我们经常会使用 * 懒加载 * ,顾名思义,就是用到的时候再开辟空间,比如iOS开发中的最常用控件UITableView,实现数据源方法的时候,通常我们都 ...
- Swift 懒加载(lazy) 和 Objective-C 懒加载的区别
在程序设计中,我们经常会使用 懒加载 ,顾名思义,就是用到的时候再开辟空间,比如iOS开发中的最常用控件UITableView,实现数据源方法的时候,通常我们都会这样写 Objective-C - ( ...
- iOS 开发UI篇 -- 懒加载学习
1. 懒加载基本 懒加载--也称为延迟加载,即在需要的时候才加载( 效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实 ...
- Hibernate Lazy属性与懒加载 整理
lazy概念:要用到的时候,再去加载,对于关联的集合来说,只有当访问到的时候,才去加载它所关联的集合,比如一个user对应很多权限,只有当user.getRights()的时候,才发出select r ...
- jQuery Lazy Load图片懒加载
传送门:官网地址,jQuery Lazy Load v1.7.2下载,Github 使用方法: 1.引用js文件 <script src="jquery.js">< ...
- 【String注解驱动开发】如何按照条件向Spring容器中注册bean?这次我懂了!!
写在前面 当bean是单实例,并且没有设置懒加载时,Spring容器启动时,就会实例化bean,并将bean注册到IOC容器中,以后每次从IOC容器中获取bean时,直接返回IOC容器中的bean,不 ...
- iOS开发UI中懒加载的使用方法
1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其getter方法.说的通俗一点,就是在开发中,当程序中需要利用的资源时.在程序启动的时候不加载 ...
- 【spring 注解驱动开发】spring组件注册
尚学堂spring 注解驱动开发学习笔记之 - 组件注册 组件注册 1.@Configuration&@Bean给容器中注册组件 2.@ComponentScan-自动扫描组件&指定扫 ...
- spring注解驱动开发
1.全图: 一.IOC容器部分 1.第一个初始化实例: @Configuration @ComponentScans @Bean("person") 注意: @repeatable ...
随机推荐
- ql的python学习之路-day15
前言:本节主要讲解的是文件路径 在实际的软件开发中会设计一个项目的文件目录,按照执行包bin.配置包config.核心包core等来设计,在执行包里面要运行核心包里的主程序mian,由于不在同一级的目 ...
- 「雕爷学编程」Arduino动手做(12)——霍尔磁力模块
37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...
- PG修改参数方法
1.查看参数文件位置 postgres=# show config_file; config_file ---------------------------------- /data/pgsql_d ...
- mysql小白系列_04 binlog(未完)
mysql打开.查看.清理binlog 1.开启日志 log_bin=/var/lib/mysql/mysql-bin mysql> show variables like '%log_bin% ...
- 自定义spring-boot-starter
需求背景: Springboot是Spring旗下优秀的子项目之一,其核心理念之一:约定优于配置.通过自动化的配置极大的提升了我们的开发效率,目前已集成诸多组件的starter起步依赖,帮助我们更加快 ...
- 洛谷P2754 [CTSC1999]家园
题目链接:https://www.luogu.org/problemnew/show/P2754 知识点: 最大流 解题思路: 先用 \(DFS\) 判断是否无解. 从时刻 \(0\) 开始枚举答案, ...
- POJ1436
题目链接:https://vjudge.net/problem/POJ-1436 解题思路:基于y轴建立线段树. 如图是根据样例画出的图.下面都以题目样例为例. 但是,如果仅仅以给出的y1, y2为边 ...
- CF834D
题目链接:http://codeforces.com/contest/834/problem/D 题目大意:将一个有n个数的数列分成k段,每段的价值为该段中不同数字的个数,求k段的最大总价值. 解题思 ...
- UVALive3720
题目大意:见刘汝佳<算法竞赛入门经典——训练指南>P173. 解题思路: 问题可以转化为求共有多少条过点阵中的点的斜线.其中必定包含左斜线和右斜线,由于点阵式对称的,所以我们只需求出左右斜 ...
- Kafka SSL安装与配置
1.概述 最近有同学咨询说,Kafka的SSL安全认证如何安装与使用?今天笔者将通过以下几个方面来介绍Kafka的SSL: Kafka 权限介绍 Kafka SSL的安装与使用 Kafka Eagle ...