翻译自https://www.baeldung.com/spring-lazy-annotation

1.概述

默认情况下,Spring会在应用程序上下文的启动时创建所有单例bean。这背后的原因很简单:立即避免和检测所有可能的错误,而不是在运行时。
但是,有些情况下我们需要创建一个bean,而不是在应用程序上下文启动时,而是在我们请求时。
在这个快速教程中,我们将讨论Spring的@Lazy注释。

2.懒加载

这个注解出现在Spring 3.0以后,有好几种方法实现来懒加载实例化bean.

2.1 @Configuration class

@Configuraiton@lazy 一起使用时,意味着所有使用@Bean 的方法都是懒加载

@Lazy
@Configuration
@ComponentScan(basePackages = "com.baeldung.lazy")
public class AppConfig {@Beanpublic Region getRegion(){return new Region();}@Beanpublic Country getCountry(){return new Country();}
}

测试用例:

@Test
public void givenLazyAnnotation_whenConfigClass_thenLazyAll() {AnnotationConfigApplicationContext ctx= new AnnotationConfigApplicationContext();ctx.register(AppConfig.class);ctx.refresh();ctx.getBean(Region.class);ctx.getBean(Country.class);
}

正如我们所看到的,只有当我们第一次请求它们时才会创建所有bean:

Bean factory for ...AnnotationConfigApplicationContext:
...DefaultListableBeanFactory: [...];
// application context started
Region bean initialized
Country bean initialized

要将它仅应用于特定的bean,让我们从类中删除@Lazy。

然后我们将它添加到所需bean的配置中:

@Bean
@Lazy(true)
public Region getRegion(){return new Region();
}

2.2 使用@Autowired

这里,为了初始化一个懒惰的bean,我们从另一个bean中引用它。

我们想要懒惰加载的bean:

@Lazy
@Component
public class City {public City() {System.out.println("City bean initialized");}
}
public class Region {@Lazy@Autowiredprivate City city;public Region() {System.out.println("Region bean initialized");}public City getCityInstance() {return city;}
}

请注意,@ Lazy在两个地方都是强制性的。
使用City类上的@Component注解并在使用@Autowired引用它时:

@Test
public void givenLazyAnnotation_whenAutowire_thenLazyBean() {// load up ctx appication contextRegion region = ctx.getBean(Region.class);region.getCityInstance();
}

在这里,当我们调用getCityInstance(0 方法时,city bean 才被初始化。

Spring系列——@lazy注解相关推荐

  1. Spring 通过 @Lazy 注解解决构造方法循环依赖问题

    什么是循环依赖? 先定义两个类 Apple.Orange,如下所示: @Component public class Apple{@Autowiredprivate Orange orange; }@ ...

  2. 【Spring】@Lazy注解

    今天主要从以下几方面来介绍一下@Lazy注解 @Lazy注解是什么 @Lazy注解怎么使用 1.@Lazy注解是什么 @Lazy注解用于标识bean是否需要延迟加载,源码如下: @Target({El ...

  3. 8.spring系列- java注解

    问题 注解是干什么的? 一个注解可以使用多次吗?如何使用? @Inherited是做什么的? @Target中的TYPE_PARAMETER和TYPE_USER用在什么地方? 泛型中如何使用注解? 注 ...

  4. Spring系列(五):@Lazy懒加载注解用法介绍

    今天给大家介绍@Lazy懒加载注解用法,希望对大家能有所帮助! 1.@Lazy 懒加载注解的概念 SpringIoC容器会在启动的时候实例化所有单实例 bean .如果我们想要实现 Spring 在启 ...

  5. spring系列-注解驱动原理及源码-bean组件注册

    目录 一.环境初始化 1.环境准备 二.bean的手动注入 1.xml方式注入bean 2.使用@Configuration&@Bean方式注入bean 三.自动扫描注册组件及bean 1.使 ...

  6. 朱晔和你聊Spring系列S1E9:聊聊Spring的那些注解

    本文我们来梳理一下Spring的那些注解,如下图所示,大概从几方面列出了Spring的一些注解: 如果此图看不清楚也没事,请运行下面的代码输出所有的结果. Spring目前的趋势是使用注解结合Java ...

  7. Spring系列之Spring常用注解总结

    参看博客:https://www.cnblogs.com/xiaoxi/p/5935009.html 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺 ...

  8. @autowired注解_品Spring:对@Autowired和@Value注解的处理方法(文末附spring系列资源合集)...

    作者:编程新说李新杰 出自:微信公众号"编程新说" 原文:品Spring:对@Autowired和@Value注解的处理方法 在Spring中能够完成依赖注入的注解有JavaSE提 ...

  9. Spring中的 @Lazy注解

    Spring IoC (ApplicationContext) 容器一般都会在启动的时候实例化所有单实例 bean . 如果我们想要 Spring 在启动的时候延迟加载 bean,即在调用某个 bea ...

  10. Spring系列之Spring常用注解总结 原文:https://www.cnblogs.com/xiaoxi/p/5935009.html

    传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文 ...

最新文章

  1. RabbitMQ 入门系列(5)— RabbitMQ 使用场景优缺点
  2. 多线激光雷达~三维建图
  3. G41显卡Linux驱动,Intel最新G41/G43/G45集成显卡驱动下载
  4. vue @click 赋值_vue 手写一个时间选择器
  5. PHP 遇见 Serverless,帮你解决这些痛点
  6. Linux软件管理器(如何使用软件管理器来管理软件)
  7. java存储过程示例_安全密码存储–请勿做的事和Java示例
  8. C++教程[又能学英文,又能学编程]
  9. 算法笔记_100:蓝桥杯练习 算法提高 三个整数的排序(Java)
  10. 使用TikZ绘制Ferrers图
  11. leetcode 215. 数组中的第 K个最 大的元素(堆排序,C语言)
  12. linux的文件权限分析
  13. 文字处理技术:搞明白了表格是如何参与文字方向的
  14. 中国地质大学网络计算机考试试题,中国地质大学《计算机》考试题答案
  15. Java词法分析器的设计与实现
  16. OSChina 周一乱弹 —— 这片城市都会属于你,而你属于我
  17. setcpu_SetCPU中文版
  18. 人工智能小白日记之2准备篇
  19. [Untiy]贪吃蛇大作战(五)——游戏主界面
  20. 为何一页的本科简历可以打败研究生

热门文章

  1. speedoffice如何调整Word文档表格单元格大小
  2. 前端实现炫酷动效_创建炫酷 CSS 背景效果的 10 个代码片段
  3. codelite开发php,C++跨平台开发环境(CodeLite)
  4. 【折半查找二叉判定树】
  5. Cannot find current proxy: Set ‘exposeProxy‘ property on Advised to ‘true‘ to make it available
  6. 突发:史蒂芬·霍金去世,享年76岁!
  7. InstallShield Slient Uninstall
  8. win7计算机里不显示摄像头,win7系统不显示摄像头的解决方法
  9. 第一集 斗罗世界 引子 穿越的唐家三少
  10. 电脑更换硬盘 | 怎么迁移数据到新硬盘?