导图社区 doGetBean
这是一篇关于doGetBean的思维导图,主要内容包括:transformedBeanName,getSingleton,getSingleton 能够获取到了Bean实例对象,getSingleton 未获取到Bean实例对象,adaptBeanInstance。
编辑于2025-10-15 23:00:38这是一篇关于doGetBean的思维导图,主要内容包括:transformedBeanName,getSingleton,getSingleton 能够获取到了Bean实例对象,getSingleton 未获取到Bean实例对象,adaptBeanInstance。
这是一篇关于spring refresh主流程的思维导图,主要内容包括:spring refresh 刷新的整个流程,主要梳理脉络,类似一个索引,但是有讲明白了,该步骤主要做了什么事情,可以为后续你学习spring 建立一个清晰的脉络,这是一个脉络,我还有每个步骤的详细讲解,可参见个人主页。
社区模板帮助中心,点此进入>>
这是一篇关于doGetBean的思维导图,主要内容包括:transformedBeanName,getSingleton,getSingleton 能够获取到了Bean实例对象,getSingleton 未获取到Bean实例对象,adaptBeanInstance。
这是一篇关于spring refresh主流程的思维导图,主要内容包括:spring refresh 刷新的整个流程,主要梳理脉络,类似一个索引,但是有讲明白了,该步骤主要做了什么事情,可以为后续你学习spring 建立一个清晰的脉络,这是一个脉络,我还有每个步骤的详细讲解,可参见个人主页。
doGetBean
1. transformedBeanName
转换Bean名称
将别名、FactoryBean名称等 转换为标准的Bean名称
返回标准的Bean名称
2. getSingleton
从单例池中获取Bean对象
Map<String, Object> singletonObjects
存储了所有的单例Bean
以上面的BeanName为key, 从map中获取Bean实例对象
解决循环依赖
三级缓存
一级缓存
Map<String, Object> singletonObjects
完整的单例对象
二级缓存
Map<String, Object> earlySingletonObjects
早期的单例对象(已实例化但未完成初始化)
三级缓存
Map<String, ObjectFactory<?>> singletonFactories
单例对象工厂
处理过程
实例化
// 创建A的流程: 1. A实例化 → 将A的ObjectFactory放入三级缓存 2. A属性注入 → 需要B → 调用getBean("B") // 创建B的流程: 3. B实例化 → 将B的ObjectFactory放入三级缓存 4. B属性注入 → 需要A → 调用getSingleton("A", true) // 获取A的流程: 5. getSingleton("A") 执行: - 一级缓存:无 - 二级缓存:无 - 三级缓存:找到A的ObjectFactory - 调用singletonFactory.getObject() → getEarlyBeanReference() - 将A从三级缓存移到二级缓存 - 返回A的早期引用 // 继续B的流程: 6. B完成属性注入(注入了A的早期引用) 7. B完成初始化 → 放入一级缓存 // 继续A的流程: 8. A完成属性注入(注入了完整的B) 9. A完成初始化 → 放入一级缓存,从二级缓存移除
最终是能返回一个单例对象的实例
3. getSingleton 能够获取到了Bean实例对象
执行逻辑
getObjectForBeanInstance
处理FactoryBean
4. getSingleton 未获取到Bean实例对象
执行创建逻辑
1. 先从父工厂中获取该Bean
BeanFactory parentBeanFactory = getParentBeanFactory()
parentBeanFactory.getBean
如果获取到了,则直接返回
2. 获取合并后最终的Bean定义
Bean定义类型
BeanDefinition (接口) ↑ AbstractBeanDefinition (抽象类) ↑ RootBeanDefinition (最终合并结果) ChildBeanDefinition (已废弃) GenericBeanDefinition (最常用的定义)
在创建Bean实例的时候,如果发现当前Bean有父类,则将父类的定义,合并到一起,为root 最终的Bean定义,来创建该Bean实例
3. 创建@DependsOn显示依赖Bean
String[] dependsOn = mbd.getDependsOn()
然后循环 getBean 创建依赖Bean
DependsOn VS 循环依赖
DependsOn
不能被spring解决
显示声明
循环依赖
spring三级缓存可解
自动注入
4. 创建单例Bean
createBean
1. 解析Bean的Class对象
将Bean定义中,改Bean的类型解析为Class对象
并放入RootBeanDefinition中
过程
过程包括类加载、验证类的存在性以及可能的安全检查
2. spring短路机制
作用
在真正的创建Bean之前,如果 InstantiationAwareBeanPostProcessor 返回了一个Bean对象,则将该Bean 实例直接作为最终Bean实例 返回,不再进行后续的创建过程
关键接口
InstantiationAwareBeanPostProcessor
Object result = bp.postProcessBeforeInstantiation(beanClass, beanName);
返回实例对象
如果有返回对象
BeanPostProcessor
processor.postProcessAfterInitialization(result, beanName)
调用bean 的后置处理方法
无返回对象
继续执行Bean的创建过程
3. doCreateBean 真正的创建Bean
1. createBeanInstance实例化Bean
1. 作用
负责Bean的实例化
推断构造函数
通过构造函数,创建bean 对象实例
2. 过程
1. 解析Bean的Class对象
1. resolveBeanClass
2. 前面已经解析过,并放在了BeanDefinition中
3. 此处直接拿即可
2. 检查Bean的访问权限(非public情况)
3. 如果存在工厂方法,则使用工厂方法创建Bean实例
4. 推断构造函数
1. determineConstructorsFromBeanPostProcessors
5. autowireConstructor
1. 使用自动装配构造方式
6. instantiateBean
6.1. 使用默认无参构造函数
3. 通过构造函数,创建Bean的实例对象 BeanWrapper
2. 扩展点,实例化后,允许修改BeanDefinition
接口以及方法
MergedBeanDefinitionPostProcessor
processor.postProcessMergedBeanDefinition(mbd, beanType, beanName);
3. 解决循环依赖
提前暴露引用,用于解决循环依赖(单例且允许循环依赖)
将Bean的ObjectFactory放入三级缓存(singletonFactories)
4. 填充Bean属性
1. 执行InstantiationAwareBeanPostProcessor 的 postProcessAfterInstantiation 方法
2. 解析PropertyValues 属性值
autowireByName
autowireByType
调用 InstantiationAwareBeanPostProcessor 的 postProcessProperties
调用 InstantiationAwareBeanPostProcessor 的 postProcessPropertyValues
3. 设置属性值到对应的属性applyPropertyValues
set属性值
5. 初始化Bean
前置初始化Bean
applyBeanPostProcessorsBeforeInitialization
调用 BeanPostProcessor 的 postProcessBeforeInitialization
调用初始化方法invokeInitMethods
bean instanceof InitializingBean
invokeCustomInitMethod
调用 Bean的初始化方法
前置初始化Bean
applyBeanPostProcessorsAfterInitialization
调用 BeanPostProcessor 的 postProcessAfterInitialization
6. 处理循环依赖
7. 注册Bean的销毁方法
5. 创建原型Ben
6. 创建最定义Scope类型bean
5. adaptBeanInstance
Bean类型转换
创建一个完整的Bean
中心主题
主题
主题
主题