• 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的

    总结

    完成的大流程

    • 实例化前准备的阶段

    • 实例化前

    • 实例化后

    • 初始化前

    • 初始化后+销毁

  • 相关阅读:
    查询集 QuerySet
    JWT的认识和session的区别
    Django REST framework 简介
    Django自动获取项目中的全部URL
    flask数据库迁移
    类中方法的两种调用方式
    flask项目配置
    NOIP 模拟 $19; m u$
    NOIP 模拟 $18; m 老司机的狂欢$
    NOIP 模拟 $18; m 炼金术士的疑惑$
  • 原文地址:https://www.cnblogs.com/qichunlin/p/13906112.html
Copyright © 2020-2023  润新知