Spring系列——@lazy注解
翻译自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注解相关推荐
- Spring 通过 @Lazy 注解解决构造方法循环依赖问题
什么是循环依赖? 先定义两个类 Apple.Orange,如下所示: @Component public class Apple{@Autowiredprivate Orange orange; }@ ...
- 【Spring】@Lazy注解
今天主要从以下几方面来介绍一下@Lazy注解 @Lazy注解是什么 @Lazy注解怎么使用 1.@Lazy注解是什么 @Lazy注解用于标识bean是否需要延迟加载,源码如下: @Target({El ...
- 8.spring系列- java注解
问题 注解是干什么的? 一个注解可以使用多次吗?如何使用? @Inherited是做什么的? @Target中的TYPE_PARAMETER和TYPE_USER用在什么地方? 泛型中如何使用注解? 注 ...
- Spring系列(五):@Lazy懒加载注解用法介绍
今天给大家介绍@Lazy懒加载注解用法,希望对大家能有所帮助! 1.@Lazy 懒加载注解的概念 SpringIoC容器会在启动的时候实例化所有单实例 bean .如果我们想要实现 Spring 在启 ...
- spring系列-注解驱动原理及源码-bean组件注册
目录 一.环境初始化 1.环境准备 二.bean的手动注入 1.xml方式注入bean 2.使用@Configuration&@Bean方式注入bean 三.自动扫描注册组件及bean 1.使 ...
- 朱晔和你聊Spring系列S1E9:聊聊Spring的那些注解
本文我们来梳理一下Spring的那些注解,如下图所示,大概从几方面列出了Spring的一些注解: 如果此图看不清楚也没事,请运行下面的代码输出所有的结果. Spring目前的趋势是使用注解结合Java ...
- Spring系列之Spring常用注解总结
参看博客:https://www.cnblogs.com/xiaoxi/p/5935009.html 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺 ...
- @autowired注解_品Spring:对@Autowired和@Value注解的处理方法(文末附spring系列资源合集)...
作者:编程新说李新杰 出自:微信公众号"编程新说" 原文:品Spring:对@Autowired和@Value注解的处理方法 在Spring中能够完成依赖注入的注解有JavaSE提 ...
- Spring中的 @Lazy注解
Spring IoC (ApplicationContext) 容器一般都会在启动的时候实例化所有单实例 bean . 如果我们想要 Spring 在启动的时候延迟加载 bean,即在调用某个 bea ...
- Spring系列之Spring常用注解总结 原文:https://www.cnblogs.com/xiaoxi/p/5935009.html
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文 ...
最新文章
- RabbitMQ 入门系列(5)— RabbitMQ 使用场景优缺点
- 多线激光雷达~三维建图
- G41显卡Linux驱动,Intel最新G41/G43/G45集成显卡驱动下载
- vue @click 赋值_vue 手写一个时间选择器
- PHP 遇见 Serverless,帮你解决这些痛点
- Linux软件管理器(如何使用软件管理器来管理软件)
- java存储过程示例_安全密码存储–请勿做的事和Java示例
- C++教程[又能学英文,又能学编程]
- 算法笔记_100:蓝桥杯练习 算法提高 三个整数的排序(Java)
- 使用TikZ绘制Ferrers图
- leetcode 215. 数组中的第 K个最 大的元素(堆排序,C语言)
- linux的文件权限分析
- 文字处理技术:搞明白了表格是如何参与文字方向的
- 中国地质大学网络计算机考试试题,中国地质大学《计算机》考试题答案
- Java词法分析器的设计与实现
- OSChina 周一乱弹 —— 这片城市都会属于你,而你属于我
- setcpu_SetCPU中文版
- 人工智能小白日记之2准备篇
- [Untiy]贪吃蛇大作战(五)——游戏主界面
- 为何一页的本科简历可以打败研究生
热门文章
- speedoffice如何调整Word文档表格单元格大小
- 前端实现炫酷动效_创建炫酷 CSS 背景效果的 10 个代码片段
- codelite开发php,C++跨平台开发环境(CodeLite)
- 【折半查找二叉判定树】
- Cannot find current proxy: Set ‘exposeProxy‘ property on Advised to ‘true‘ to make it available
- 突发:史蒂芬·霍金去世,享年76岁!
- InstallShield Slient Uninstall
- win7计算机里不显示摄像头,win7系统不显示摄像头的解决方法
- 第一集 斗罗世界 引子 穿越的唐家三少
- 电脑更换硬盘 | 怎么迁移数据到新硬盘?