spring创建bean流程
2021-11-17 14:19:00 22 举报
spring创建bean流程
作者其他创作
大纲/内容
出
检查是否为abstract
通过反射属性注入
从一级缓存中获取
bean的销毁方法封装在DisposableBean中
加入一级缓存
放入正在创建的原型bean名称集合中
有
否
这里可能涉及循环依赖
无
为bean注册DisposableBean
不是工厂bean或者入参name以&开头
5
提前暴露单例bean
是
排除掉各种Aware接口的属性跟GCLIB产生的属性
执行实例化后处理器
放入正在创建的单例bean名称集合中
addSingletonFactory
此处理器可控制是否继续熟悉填充
从正在创建的原型bean名称集合移除
缓存有值且无入参
去父容器中查找
一致
registeredSingletons
1
判断是否原型模式的依赖循环
单例 && 允许循环依赖 && 该bean正在被创建中
getSingleton
sharedInstance
getBean方法
从二级缓存中获取
类:AbstractBeanFactory
通过工厂方法
createBeanInstance
执行InitializingBean的初始化方法 afterPropertiesSet
有机会替换原来的bean
3
类:DefaultSingletonBeanRegistry
提取标准名称
alreadyCreated
中断属性注入
从三级缓存中获取bean的工厂
singletonsCurrentlyInCreation
根据属性类型获取填充值
缓存中没有
无且允许创建早期引用
从三级缓存移除从二级缓存移除
2
执行后处理器的属性值处理
通过无参构造器
标记bean为已创建
执行初始化后置处理(可能会执行)
删除三级缓存放入二级缓存
通过有参构造器
调用工厂的getObject方法
是否需要提前暴露bean
最终返回的bean
执行配置的init-method方法
添加到已注册的单例bean名称集合中
doCreateBean
过滤出需要校验的属性
根据属性名称获取填充值
合并beanDefinition
将单例工厂类放入三级缓存中
填充Aware类型接口的属性
解析类型的表达式(如果有的话)
全部删除成功
从正在创建的单例bean名称集合移除
其他
继续属性填充
会将beanName放入alreadyCreated集合中
此时还未真正填充
执行智能实例化感知 Bean 后处理器
判断是否循环depend on
初始化后置处理
实例化前置处理
有可能调
开始进入属性填充populateBean
调用单例工厂singletonFactory.getObject方法
移除二级缓存(如果有的话)
bean
单例
异常
执行MergedbeanDefinition后处理器
返回了代替原本目标对象的实例
类:AbstractAutowireCapableBeanFactory
处理方法覆盖methodOverrides
createBean
生成单例工厂类
singletonObjects
是工厂bean
getObjectForBeanInstance
判断该scop类型是否注册过
此处已经创建bean对象
注册dependOn依赖
4
prototypesCurrentlyInCreation
初始化前置处理
从二级缓存中获取该bean与当前的bean比较
无且单例正在创建中
两个bean不一致
创建包装类BeanWrapper
convertIfNecessary
对于提前暴露的bean的循环依赖的再次校验
singletonFactories
原型
目前除了singleton 跟prototype还有request、session、global session(通常是和XmlWebApplicationContext共同使用)
遍历dependOn进行getBean调用
0 条评论
下一页