Bean生命周期与三级缓存解决循环依赖

搜索Bean生命周期有很多博客,大部分是Copy,有些还是错的。
最近我看了源码,仔细了解了下流程,先上图:在这里插入图片描述

获取Bean

这个时候InstantiationAwareBeanPostProcessor有机会通过postProcessBeforeInstantiation方法(执行后执行applyBeanPostProcessorsAfterInitialization方法)直接返回一个Bean对象,不走下面的流程。

  • Bean 实例化(构造方法)
  • 将实例的引用放入第三级缓存singletonFactories中
  • Bean属性配置
    • 所有的InstantiationAwareBeanPostProcessor执行postProcessAfterInstantiation
    • 所有的 InstantiationAwareBeanPostProcessor执行postProcessProperties,postProcessPropertyValues
      • AutowiredAnnotationBeanPostProcessor 这里会去找Bean的@AutoWired和@Refrence的Bean(比如A依赖了B)并且去加载
        • 如果此依赖Bean(比如B)反过来依赖了原Bean(比如A)。首先去singletonObjects中寻找A,没有找到。那么会从第三级缓存singletonFactories将A取出来,放入earlySingletonObjects中.并且B依赖此引用A.等待B加载完成,A再依赖B
      • AutowiredAnnotationBeanPostProcessor 这里会去找到@Value注解的值,装配上
  • Bean 初始
    • 实现了BeanNameAware 执行setBeanName
    • 实现了BeanClassLoaderAware执行setBeanClassLoader
    • 实现了BeanFactoryAware 执行setBeanFactory
    • 调用所有的BeanPostProcessor的postProcessorBeforeInitialization
      • 实现了ApplicationContextAware执行setApplicationContext,这个逻辑写在ApplicationContextAwareProcessor中,其实也是一个BeanPostProcessor,与setBeanName等不同
    • 实现了InitializingBean执行afterPropertiesSet
    • 执行配置的init-method
    • 调用所有的BeanPostProcessor的postProcessorAfterInitialization
  • 加入singletonObjects,并且从earlySingletonObjects,singletonFactories中去除自身引用
  • Bean销毁

InstantiationAwareBeanPostProcessor 继承了 BeanPostProcessor,在Bean实例化的时候起作用。由于也是BeanPostProcessor,理论上在Bean初始化的时候也能起作用。

三级缓存,均为HashMap:首先从singletonObjects取,其次从earlySingletonObjects中取,取不到再去singletonFactories中取。从singletonFactories取之后放入earlySingletonObjects中。

spring借此机制完成了Bean循环依赖的解决。但是如果是通过构造方法的循环依赖,AB的构造方法中均依赖了对方,那么循环依赖不能解决。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章