写在前面

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. webpack打包时修改package.json的版本号,并输出相关版本

    可直接修改的方式 { plugins: [ function() { // 修改package.json中的版本号 this.plugin('done', function() { const pkg ...

  2. Vue路由的hash模式与history模式的区别?

    1.首先router有两种模式:hash模式(默认).history模式(需配置mode: 'history') hash和history的区别?   hash                    ...

  3. C# 数据操作系列 - 13 SugarSql初探

    0. 前言 前言,暂时挥别NHibernate(虽然我突然发现这玩意还挺有意思的,不过看得人不多).大步进入了有很多小伙伴向我安利的SQLSugar,嗯,我一直叫SugarSQL,好像是这个吧? 这是 ...

  4. 牛客网挑战赛19 B,C,F

    链接:https://www.nowcoder.com/acm/contest/131/B来源:牛客网 矩阵 M 包含 R 行 C 列,第 i 行第 j 列的值为 Mi,j. 请寻找一个子矩阵,使得这 ...

  5. poj1904 完美匹配+Tarjan

      King's Quest Time Limit: 15000MS   Memory Limit: 65536K Total Submissions: 9460   Accepted: 3497 C ...

  6. 【Java】手把手模拟CAS,瞬间理解CAS的机制

    话不多少,先看个案例,[模拟100个用户,每个用户访问10次网站]”: public class ThreadDemo1 { //总访问量 ; //模拟访问的方法 public static void ...

  7. 愉快地使用Windows Terminal

    有了Windows Terminal 你再也不需要其他任何终端了-- 下载 直接到Windows 10 自带的应用商店下载安装.参考: https://github.com/Microsoft/Ter ...

  8. VueCli4构建项目如何配置文件路径别名?

    1.在项目文件根目录上创建 vue.config.js 文件 2.写入以下代码,具体内容见注释: const path = require('path') // 引入path模块 function r ...

  9. web自动化之Select标签操作

    from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...

  10. 读Pyqt4教程,带你入门Pyqt4 _009

    QLineEdit QLineEdit 窗口组件用来输入或者编辑单行纯文本,有撤销/重做,剪切/粘贴和拖放功能. #!/usr/bin/python # -*- coding: utf-8 -*- # ...