2020.10.31 Spring的Bean的生命周期

Spring的Bean的生命周期

获取Bean

第一阶段获取Bean

这里的流程图入口在AbstractBeanFactory 类的doGetBean方法,这里可以配合前面的getBean方法分析,主要流程是

  • 先处理Bean的名称,因为如果以 "&" 开头的Bean名称标识获取的是对应的FactoryBean对象;

  • 从缓存中获取单例Bean,有则进一步判断这个Bean 是不是再创建中,如果是的就等待创建完毕,否则直接返回这个Bean对象

  • 如果不存在单例Bean缓存,则先进行循环依赖的解析

  • 解析完毕之后先获取父类BeanFactory,获取到了则调用父类的getBean 方法,不存在则先合并然后创建Bean

创建Bean

创建Bean之前

在真正创建Bean之前逻辑

这个流程图对应的代码在AbstractAutowireCapableBeanFactory类的 createBean方法中。

  • 这里或先获取 RootBeanDefinition 对象中的Class对象并确保已经关联了要创建的Bean的Class。
  • 这里会检查3个条件
    • Bean的属性中的 beforeInstantiationResolved 字段是否为true,默认是 false。
    • Bean是原生的Bean
    • Bean的hasInstantiationAwareBeanPostProcessors属性为true,这个属性在Spring准备刷新容器前转为BeanPostProcessors 的时候会设置,如果当前Bean实现了InstantiationAwareBeanPostProcessor 则这个就会是true

当三个条件都存在的时候,就会调用实现 InstantiationAwareBeanPostProcessor接口的postProcessorBeforeInstantiation方法,然后获取返回的Bean,如果返回的Bean不是null还会调用实现BeanPostProcessors接口的postProcessAfterInitialization 方法,看代码说明

如果上面3个条件其中一个不满足就不会调用实现的方法。默认这里都不会调用这些BeanPostProcessors 的实现方法,然后继续执行后面的doCreateBean 方法。

真正的创建Bean。doCreateBean

doCreateBean方法逻辑
这个代码的实现还是在AbstractAutowireCapableBeanFactory方法中。流程是

  • 先检查instanceWrapper 变量是不是null,这里一般是null除非当前正在创建得Bean在factoryBeanInstanceCache中存在这个是保存还没创建完成的FacotryBean的集合。
  • 调用createBeanInstance方法实例化Bean
  • 如果当前RootBeanDefinition对象还没有调用过实现了的 MergedBeanDefinitionPostProcessor接口的方法,则会进行调用
  • 当满足一下三点
    • 是单例bean
    • 尝试解析bean之间的循环引用
    • bean目前正在创建中

则会进一步检查是否实现了SmartInstantiationAwareBeanPostProcessor 接口如果实现了则调用是实现的getEarlyBeanReference方法

  • 调用populateBean 方法进行属性填充,这里后面会讲解
  • 调用initialzeBean 方法对Bean 进行初始化
实例化Bean,createBeanInstance

实例化Bean


destory方法跟销毁Bean

Bean创建完毕之后会检查用户是否指定了 destoryMethodName以及是否实现了DestructionAwareBeanPostProcessor接口的requireDestruction方法,如果指定了会记录下来保存在DisposableBeanAdapter 对象中并保存在bean的disposableBeans 属性中。代码在啊AbstractBeanFactory的

总结

完成的大流程

  • 实例化前准备的阶段

  • 实例化前

  • 实例化后

  • 初始化前

  • 初始化后+销毁

posted @ 2020-10-31 14:19  LegendQi  阅读(136)  评论(0编辑  收藏  举报