当前位置:   article > 正文

【HBZ分享】Spring启动时核心refresh方法流程

【HBZ分享】Spring启动时核心refresh方法流程

refresh核心代码所在位置

  1. 在AbstractApplicationContext类中的refresh方法中

refresh的业务流程编排

  1. 调用obtainFreshBeanFactory()去创建一个全新的BeanFactory工厂,类型为DefaultListableBeanFctory,其功能为【解析xml】将里面bean标签内容解析成【生成BeanDefinition】并注册到【BeanDefinitionRegistry】(核心)
  2. beanFactory准备工作,对新的BeanFactory做各种后置处理,就是设置相关参数内容。
  3. 启动时调用invokeBeanFactoryPostProcessors(beanFactory)查找所有实现BeanFactoryPostProcessor接口的类,并逐一调用其postProcessBeanFactory方法(注意:如果一个自定义的类实现了BeanFactoryPostProcessor,则这个类会在这一步进行实例化,即调用构造方法,如果没实现,则会在第7步实例化)。
  4. 调用registerBeanPostProcessors(beanFactory)去为该bean创建一个BeanPostProcessors,即该bean实例化后,要在初始化前后执行这个bean的后置处理(注意,这里只是创建出BeanPostProcessors,并不是执行其内部的方法,执行操作在后面实例化, 并且如果自定义类实现了BeanPostProcessors,则会在这一步进行实例化,即调用构造方法)
  5. 初始化信息源,广播事件等
  6. 注册ApplicationListener应用监听器
  7. 调用finishBeanFactoryInitialization(beanFactory)去实例化所有单例非懒加载的bean, 期间会执行bean的【构造方法(没有实现BeanFactoryPostProcessor 或 BeanPostProcessors)】,【填充属性】,【初始化方法init-method】, BeanPostProcessor后置处理器的【postProcessBeforeInitialization】和【postProcessAfterInitialization】方法(核心)。(注意:这里面执行的自定义类可能存在实例化,也可能没有实例化,如果实现了BeanFactoryPostProcessor 或 BeanPostProcessors则是已经实例化的。则这里不需要再进行实例化,其他的自定义普通类那就是还没实例化,则需要在这里做实例化。)
  8. 承接第7点,如果这个类已经实例化了,那么就会从容器内直接通过beanName进行获取。即实现了BeanFactoryPostProcessor 或 BeanPostProcessors的那些类
  9. 事件发布finishRefrash()

源码展示:
在这里插入图片描述

核心方法-obtainFreshBeanFactory()

  1. 该方法做了3件大事: 【读取beans.xml】【解析成BeanDefinition】【将解析的BeanDefinition放入Map集合,即IOC】
  2. 先判断该beanFactory是否存在, 如果已经存在,则直接销毁。
  3. 创建一个新的空的beanFactory工厂
  4. 给该beanFactory生成一个id,方便序列化 和 反序列化
  5. 读取xml文件(文件名不一定叫beans.xml), 使用inputStream的方式,把xml文件内容读取到内存,并转成Document对象,为下面的解析做准备。
  6. 通过反射,解析出xml中每个bean标签的BeanDefinition对象, 并获取bean标签的id属性
  7. 将id作为IOC容器的key, BeanDefinition作为IOC容器的value,保存到IOC容器中。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/948312
推荐阅读
相关标签
  

闽ICP备14008679号