当前位置:网站首页>Bean创建流程 与 lazy-init 延迟加载机制原理
Bean创建流程 与 lazy-init 延迟加载机制原理
2022-06-30 04:30:00 【悠然予夏】
1、Bean创建流程
- 通过最开始的关键时机点分析,我们知道Bean创建⼦流程入口在AbstractApplicationContext#refresh()方法的finishBeanFactoryInitialization(beanFactory) 处

- 进⼊finishBeanFactoryInitialization

- 继续进入DefaultListableBeanFactory类的preInstantiateSingletons方法,我们找到下面部分的代码,看到工厂Bean或者普通Bean,最终都是通过getBean的方法获取实例
- 继续跟踪下去,我们进入到了AbstractBeanFactory类的doGetBean方法,这个方法中的代码很多,我们直接找到核心部分
- 接着进入到AbstractAutowireCapableBeanFactory类的方法,找到以下代码部分
- 进入doCreateBean方法看看,该方法我们关注两块重点区域
- 创建Bean实例,此时尚未设置属性

- 给Bean填充属性,调⽤初始化⽅法,应⽤BeanPostProcessor后置处理器

- 创建Bean实例,此时尚未设置属性
2、 lazy-init 延迟加载机制原理
2.1、lazy-init 延迟加载机制分析
普通 Bean 的初始化是在容器启动初始化阶段执行的,而被lazy-init=true修饰的 bean 则是在从容器里第⼀次进行context.getBean() 时进行触发。Spring 启动的时候会把所有bean信息(包括XML和注解)解析转化成Spring能够识别的BeanDefinition并存到Hashmap里供下面的初始化时用,然后对每个BeanDefinition 进行处理,如果是懒加载的则在容器初始化阶段不处理,其他的则在容器初始化阶段进行初始化并依赖注⼊。
public void preInstantiateSingletons() throws BeansException {
// 所有beanDefinition集合
List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);
// 触发所有⾮懒加载单例bean的初始化
for (String beanName : beanNames) {
// 获取bean 定义
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
// 判断是否是懒加载单例bean,如果是单例的并且不是懒加载的则在容器创建时初始化
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
// 判断是否是 FactoryBean
if (isFactoryBean(beanName)) {
final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);
boolean isEagerInit;
if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
@Override
public Boolean run() {
return ((SmartFactoryBean<?>) factory).isEagerInit();}}, getAccessControlContext());
}
} else {
/*
如果是普通bean则进⾏初始化并依赖注⼊,此 getBean(beanName)接下来触发的逻辑
和
懒加载时 context.getBean("beanName") 所触发的逻辑是⼀样的
*/
getBean(beanName);
}
}
}
}2.2、总结
- 对于被修饰为lazy-init的bean Spring 容器初始化阶段不会进行 init 并且依赖注入,当第一次进行getBean时候才进行初始化并依赖注入
- 对于非懒加载的bean,getBean的时候会从缓存里头获取,因为容器初始化阶段 Bean 已经初始化完成并缓存了起来
边栏推荐
- Qt Creator 8 Beta2发布
- Troubleshoot abnormal video playback problems in public network deployment based on Haikang ehomedemo tool
- 2021-07-14
- 小C的数组(array)
- AI落地的新范式,就“藏”在下一场软件基础设施的重大升级里
- FortiGate firewall configuration log uploading regularly
- Day 11 script and game AI
- Basic knowledge of redis
- El upload Upload file (Manual upload, Automatic upload, upload progress)
- The new paradigm of AI landing is "hidden" in the next major upgrade of software infrastructure
猜你喜欢

File and IO

Myrpc version 1
![Salary management system based on servlet+jsp+mysql [source code + database]](/img/4a/6015cf17f4297691e97b48a5592fc5.png)
Salary management system based on servlet+jsp+mysql [source code + database]

输入输出及中断技术——微机第六章学习笔记

JS inheritance

Interview topic of MySQL

Introduction to system programming

破局存量客群营销,试一下客户分群管理(含聚类模型等实操效果评估)

基于ROS的SLAM建图、自动导航、避障(冰达机器人)

Anonymous pipeline for interprocess communication
随机推荐
Troubleshoot abnormal video playback problems in public network deployment based on Haikang ehomedemo tool
Maya Calendar(POJ1008)
Implementation steps of dynamic proxy
JS file block to Base64 text
Anonymous pipeline for interprocess communication
Qt 6.3.1Conan软件包发布
数据链路层详解
破局存量客群营销,试一下客户分群管理(含聚类模型等实操效果评估)
Unity when entering a string in the editor, escape the input of characters
JS proxy
errno和perror
File system and directory operations
FortiGate firewall quick initialization administrator password
知识点滴 - 如何用3个简单的技巧在销售中建立融洽的关系
An error occurs when sqlyog imports the database. Please help solve it!
Use of thread pool
【WEBRTC】ADM: rtc_ include_ internal_ audio_ Device triggers RTC_ Dcheck (ADM) assertion
Ananagrams(UVA156)
进程间通信之匿名管道
Collinearity problem