Spring5.2.x-05-SpringBean生命周期
-
类似new了一个对象
-
先填充@Autowired的属性注入
-
再填充自动注入的属性注入(如果改了注入模型模型)
-
new一个对象(只是对象, 无注入)
AbstractAutowireCapableBeanFactory里instanceWrapper = createBeanInstance(beanName, mbd, args); -
属性填充, 不断遍历BeanDefinition, 看是否有实现相应的接口, 做了扩展
2.1 执行实现MergedBeanDefinitionPostProcessor的BeanPostProcessor
默认有2个, 一个是CommonAnnotationBeanPostProcessor, 一个是AutowiredAnnotationBeanPostProcessor
AutowiredAnnotationBeanPostProcessor构建了一个注入器, 做了一个缓存
2.2 实现InstantiationAwareBeanPostProcessor的BeanPostProcessor
- ConfigurationClassPostProcessor 代理对象才增强
- CommonAnnotationBeanPostProcessor 注入
- AutowiredAnnotationBeanPostProcessor 注入
applyPropertyValues(beanName, mbd, bw, pvs); 改变注入模型, 自动注入
总体分为:
-
容器启动阶段
扫描/实例化bd对象
注册BeanPostProcessor
验证bd是否合格(普通bean/原型/抽象/懒加载等) -
bean的对象实例化方法
推断实例化方法
实例化对象 -
bean的属性注入阶段
提前暴露/循环依赖做支持
查找注入信息
判断是否需要完成属性注入
完成注解解析的属性输入 -
bean的初始化阶段
各种aware接口的回调
各种初始化方法的回调
对bena的各种扩展(后置处理器) aop
此时是完整的bean
-
bean的缓存阶段
各种临时变量的删除
缓存到单例池 -
bean的销毁阶段
销毁方法的回调
移除单例池
循环依赖
理论上只要2种, 一种是半成品的bean, 一种是成品的bean, 在循环依赖的时候给半成品bean就行, 但问题是有时候会在回调里直接调用半成品的某些方法, 而这个方法又被aop切面了...
三级缓存: objectFactory缓存, 万一需要对bean做扩展(如代理), 所以给的factory
二级缓存: earlySingletonObjects三级缓存的factory做好处理后的半成品bean
二级和三级缓存, 半成品只会有1个, 因为可能有多次循环, 就不用重复创建bean, 只要拿二级缓存的bean就行了
一级缓存: singletonObjects, 成品bean