延迟初始化Spring Bean:延迟初始化的Bean会影响依赖注入吗?
时间:2022-07-28
本文章向大家介绍延迟初始化Spring Bean:延迟初始化的Bean会影响依赖注入吗?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前面提到过Bean的初始化方式,在Bean 的配置元信息时候我们知道Bean的元信息配置中有lazy-init 延迟初始化属性配置,延迟初始化Spring Bean 还有Java 注解API的方式实现
案例分析
这里已Java 注解方式案例讲解描述
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lazy {
/**
* Whether lazy initialization should occur.
*/
boolean value() default true;
}
看到Lazy 注解有默认属性配置true,非延迟加载;如果我们使用非延迟加载其实可以不用标注此注解,这里方便代码阅读标注上
- 非延迟加载
运行结果 可以看出延迟加载在应用上下文启动之后加载
- 延迟加载
运行结果 可以看出延迟加载在应用上下文启动之前加载
分析
其中的差异可以查看源码分析在
applicationContext.refresh()
启动应用上下文方法中可以看到一个方法
finishBeanFactoryInitialization(beanFactory);
这个方法的作用是完成Bean的初始化动作,看注释
Instantiate all remaining (non-lazy-init) singletons.
它的意思就是:它会去初始化或者是实例化我们所有的非延迟初始化的一个单体类或者单体Bean
进入方法里面又可以发现
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
这里又进行补充,就是初始化我们剩余的这些东西
换而言之在我们应用上下启动的时候有一个前置动作,普通的Bean在这里初始化 ,部分Bean是需要我们内部容器自己做初始化 。另一个动作就是延迟加载按需加载Bean
总结
其实延迟加载和非延迟加载在定义的时候,就是Bean注册的时候是没有区别按照你需要的时候进行注册;但是在依赖查找和依赖注入的时候它的区别就体现出来了,一个是在应用上下文启动之前,另一个在应用上下文启动之后
源码地址:
https://gitee.com/iByteCoding/thinking-in-spring
往期推荐
注册Spring Bean:如何将BeanDefinition注册到IoC容器?
- Python入门讲解
- DDM: 一个简洁的前端领域模型库
- 前后端分离之领域模型的思考
- 类选择符和ID选择符
- 仿网易新闻页面效果
- VS.Net 2005 Design-Time Integration
- XML Serializable Generic Dictionary
- MATLAB简易验证码识别程序介绍
- android之listview缓存图片(缓存优化)
- 使用ASP.NET实现Model View Presenter(MVP)
- android性能优化1
- 百度地图之收索视野内的建筑物
- Line Counter - Writing a Visual Studio 2005 Add-In
- 百度地图之标注聚会
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 我用 OpenGL 实现了那些年流行的相机滤镜
- 使用minikube安装kubernetes和dashboard
- FFmpeg + OpenGLES 实现视频解码播放和视频滤镜
- 行为型设计模式:模板模式
- 容器中的隔离与限制:namespace和cgroups
- 行为型设计模式:策略模式
- redis实战第十二篇 redis cluster请求重定向
- 行为型设计模式:责任链模式以及mybatis中的责任链
- java中BigDecimal使用和注意事项
- redis实战第十一篇 redis cluster添加密码
- Linux下docker制作springboot应用镜像
- 行为型设计模式:备忘录模式
- 行为型设计模式:访问者模式
- redis实战第十篇 集群收缩
- redis实战第九篇 集群扩容自动迁移槽(redis-cli)