【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容器中。
  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值