写在前面

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注解实现懒加载的更多相关文章

  1. iOS 开发——实用技术Swift篇&Swift 懒加载(lazy)

    Swift 懒加载(lazy) 在程序设计中,我们经常会使用 * 懒加载 * ,顾名思义,就是用到的时候再开辟空间,比如iOS开发中的最常用控件UITableView,实现数据源方法的时候,通常我们都 ...

  2. Swift 懒加载(lazy) 和 Objective-C 懒加载的区别

    在程序设计中,我们经常会使用 懒加载 ,顾名思义,就是用到的时候再开辟空间,比如iOS开发中的最常用控件UITableView,实现数据源方法的时候,通常我们都会这样写 Objective-C - ( ...

  3. iOS 开发UI篇 -- 懒加载学习

    1. 懒加载基本 懒加载--也称为延迟加载,即在需要的时候才加载( 效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实 ...

  4. Hibernate Lazy属性与懒加载 整理

    lazy概念:要用到的时候,再去加载,对于关联的集合来说,只有当访问到的时候,才去加载它所关联的集合,比如一个user对应很多权限,只有当user.getRights()的时候,才发出select r ...

  5. jQuery Lazy Load图片懒加载

    传送门:官网地址,jQuery Lazy Load v1.7.2下载,Github 使用方法: 1.引用js文件 <script src="jquery.js">< ...

  6. 【String注解驱动开发】如何按照条件向Spring容器中注册bean?这次我懂了!!

    写在前面 当bean是单实例,并且没有设置懒加载时,Spring容器启动时,就会实例化bean,并将bean注册到IOC容器中,以后每次从IOC容器中获取bean时,直接返回IOC容器中的bean,不 ...

  7. iOS开发UI中懒加载的使用方法

    1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其getter方法.说的通俗一点,就是在开发中,当程序中需要利用的资源时.在程序启动的时候不加载 ...

  8. 【spring 注解驱动开发】spring组件注册

    尚学堂spring 注解驱动开发学习笔记之 - 组件注册 组件注册 1.@Configuration&@Bean给容器中注册组件 2.@ComponentScan-自动扫描组件&指定扫 ...

  9. spring注解驱动开发

    1.全图: 一.IOC容器部分 1.第一个初始化实例: @Configuration @ComponentScans @Bean("person") 注意: @repeatable ...

随机推荐

  1. vue的slot

    1.明确一点:分发内容是在父作用域内编译: 2.slot作为备用内容的条件:宿主元素为空且父元素没有要分发的内容. 3.具名slot:<slot name="XXX"> ...

  2. MySQL常见面试题索引、表设计

    正确使用索引的条件 1.建立索引的列的重复度不能太高 2.条件列不能参与计算 3.不能使用函数 4.条件中不能使用范围 5.不要使用like '%c' 6.条件中用or a=0 or b=1 or c ...

  3. js 文本框只能输入数字和点

    http://www.jb51.net/article/51102.htm 手机端 只能输入数字,能输小数点.且只能2位小数 oninput="this.value=this.value.r ...

  4. Spring 中的事件处理

    Spring 中的事件处理 Spring 的核心是 ApplicationContext,它负责管理 beans 的完整生命周期.当加载 beans 时,ApplicationContext 发布某些 ...

  5. 解决使用IDEA启动Tomcat成功但localhost:8080无法访问的问题

    解决使用IDEA启动Tomcat成功但localhost:8080无法访问的问题

  6. linux查看磁盘使用情况命令

    第一:统一磁盘整体情况,包括磁盘大小,已使用,可用1.查看当前目录命令 df -h1结果: 统一每个目录下磁盘的整体情况 2.查看指定目录在命令后直接放目录名,比如查看“usr”目录使用情况: df ...

  7. Ajax用法查询

    1)$.get(url, [data], [callback], [type]) 2)$.post(url, [data], [callback], [type]) 其中: url:代表请求的服务器端 ...

  8. 跳出初学MySQL知识的原理整理(一)

    一.基础架构 MySQL 可以分为 Server 层和存储引擎层两部分. Server 层包括连接器.查询缓存.分析器.优化器.执行器等,所有跨存储引擎 的功能都在这一层实现,比如存储过程.触发器.视 ...

  9. 《Head First 设计模式》:策略模式

    正文 一.定义 策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户. 要点: 策略模式把系统中会变化的部分抽出来封装. 二.实现步骤 1.创建策略接口 ...

  10. JavaScript实现树深度优先和广度优先遍历搜索

    1.前置条件 我们提前构建一棵树,类型为 Tree ,其节点类型为 Note.这里我们不进行过多的实现,简单描述下 Note 的结构: class Node{ constructor(data){ t ...