Spring5.2.x-05-SpringBean生命周期

  1. 类似new了一个对象

  2. 先填充@Autowired的属性注入

  3. 再填充自动注入的属性注入(如果改了注入模型模型)

  4. new一个对象(只是对象, 无注入)
    AbstractAutowireCapableBeanFactory里instanceWrapper = createBeanInstance(beanName, mbd, args);

  5. 属性填充, 不断遍历BeanDefinition, 看是否有实现相应的接口, 做了扩展
    2.1 执行实现MergedBeanDefinitionPostProcessor的BeanPostProcessor
    默认有2个, 一个是CommonAnnotationBeanPostProcessor, 一个是AutowiredAnnotationBeanPostProcessor
    AutowiredAnnotationBeanPostProcessor构建了一个注入器, 做了一个缓存

2.2 实现InstantiationAwareBeanPostProcessor的BeanPostProcessor

  • ConfigurationClassPostProcessor 代理对象才增强
  • CommonAnnotationBeanPostProcessor 注入
  • AutowiredAnnotationBeanPostProcessor 注入

applyPropertyValues(beanName, mbd, bw, pvs); 改变注入模型, 自动注入


总体分为:

  1. 容器启动阶段
    扫描/实例化bd对象
    注册BeanPostProcessor
    验证bd是否合格(普通bean/原型/抽象/懒加载等)

  2. bean的对象实例化方法
    推断实例化方法
    实例化对象

  3. bean的属性注入阶段
    提前暴露/循环依赖做支持
    查找注入信息
    判断是否需要完成属性注入
    完成注解解析的属性输入

  4. bean的初始化阶段
    各种aware接口的回调
    各种初始化方法的回调
    对bena的各种扩展(后置处理器) aop

此时是完整的bean

  1. bean的缓存阶段
    各种临时变量的删除
    缓存到单例池

  2. bean的销毁阶段
    销毁方法的回调
    移除单例池

循环依赖

理论上只要2种, 一种是半成品的bean, 一种是成品的bean, 在循环依赖的时候给半成品bean就行, 但问题是有时候会在回调里直接调用半成品的某些方法, 而这个方法又被aop切面了...

三级缓存: objectFactory缓存, 万一需要对bean做扩展(如代理), 所以给的factory
二级缓存: earlySingletonObjects三级缓存的factory做好处理后的半成品bean
二级和三级缓存, 半成品只会有1个, 因为可能有多次循环, 就不用重复创建bean, 只要拿二级缓存的bean就行了

一级缓存: singletonObjects, 成品bean

posted @ 2022-08-14 15:16  RichardHaha  阅读(26)  评论(0编辑  收藏  举报