当前位置: 首页 > news >正文

【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容器中。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 0022__gitbash中文乱码显示数字问题
  • SQL注入漏洞的防范措施
  • 为什么选择在Facebook投放广告?
  • 【数据结构与算法 | 哈希表篇】力扣387
  • 4.mysql约束
  • 【数据结构与算法】哈希表
  • JAVA—异常
  • 深度学习入门指南(1) - 从chatgpt入手
  • Docker③_VMware虚拟机和Docker的备份与恢复
  • CST软件如何设置硬件加速选项GPU DCMPI token?
  • (自用)交互协议设计——protobuf序列化
  • python笔记和练习----少儿编程课程【阶段一(二)】
  • 【案例38】Can’t get connection from database 排查详细记录
  • GPS跟踪环路MATLAB之——数字锁频环
  • 可视耳勺靠谱吗?五款杰出可视挖耳勺种草!
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【React系列】如何构建React应用程序
  • css的样式优先级
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • dva中组件的懒加载
  • HTML5新特性总结
  • js中forEach回调同异步问题
  • markdown编辑器简评
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Node 版本管理
  • 动态规划入门(以爬楼梯为例)
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 如何利用MongoDB打造TOP榜小程序
  • 原生Ajax
  • #Java第九次作业--输入输出流和文件操作
  • #NOIP 2014# day.1 T2 联合权值
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (C语言)共用体union的用法举例
  • (八十八)VFL语言初步 - 实现布局
  • (搬运以学习)flask 上下文的实现
  • (待修改)PyG安装步骤
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)计算机毕业设计大学生兼职系统
  • (六)c52学习之旅-独立按键
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十七)Flink 容错机制
  • (四) Graphivz 颜色选择
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .Net Core 微服务之Consul(二)-集群搭建
  • .net wcf memory gates checking failed
  • .net 程序发生了一个不可捕获的异常
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET单元测试
  • .Net中间语言BeforeFieldInit
  • ?