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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/396310.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

尚硅谷谷粒商城项目笔记——十、调试前端项目renren-fast-vue【电脑CPU:AMD】

十、调试前端项目renren-fast-vue 如果遇到其他问题发在评论区,我看到后解决 1 先下载安装git git官网下载地址 2 登录gitee搜索人人开源找到renren-fast-vue复制下载链接。【网课视频中也有详细步骤】 3 下载完成后桌面会出现renren-fast-vue的文件夹 4 开始调…

对于springboot无法连接redis解决方案

对于springboot无法连接redis解决方案 一、测试是否能在本地应用上访问到你的redis(如果是部署在linux上的话)1. 开启telnet功能2. 开始测试端口是否能访问到(适用于所有,包括MQ)3. 开放6379端口4. 看spring的配置文件…

java springboot mqtt控制海康摄像头

GHHKControlService 接口 package org.gh.ghhk.service;public interface GHHKControlService {boolean monitorControl(String payload);}GHHKControlServiceImpl 实现类 ​ package org.gh.ghhk.service.impl;import com.alibaba.fastjson.JSONArray; import com.alibaba.…

MySQL —— CRUD

CRUD CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写。 我们常说增删查改,增删改查… 这里我们的增删查改是对表格的数据行进行操作的~~ 新增 1.1.1 单行数据 全列插入 插入一行新数据行,使用 insert into t…

微信小程序项目-宠物商城项目uniapp源码和代码讲解

🤹‍♀️潜意识起点:个人主页 🎙座右铭:得之坦然,失之淡然。 💎擅长领域:大前端 是的,我需要您的: 🧡点赞❤️关注💙收藏💛 是我…

Django 自定义用户 VS 用户资料

Django是一个流行的Web框架,它提供了一套完整的用户认证系统,其中包括内置的User模型用于存储基本的用户信息,如用户名、密码等。然而,如果我们需要更详细的用户资料管理,比如添加更多的字段或者自定义验证规则&#x…

分布式主键 详解

文章目录 雪花算法结合分库分表的问题问题出现原因分析解决思路 分布式主键要考虑的问题主键生成策略雪花算法详解时间戳位问题工作进程位问题序列号位问题根据雪花算法扩展基因分片法 雪花算法结合分库分表的问题 问题出现 使用ShardingSphere框架自带的雪花算法生成分布式主…

LVS(Linux virual server)详解

目录 一、LVS(Linux virual server)是什么? 二、集群和分布式简介 2.1、集群Cluster 2.2、分布式 2.3、集群和分布式 三、LVS运行原理 3.1、LVS基本概念 3.2、LVS集群的类型 3.2.1 nat模式 3.2.2 DR模式 3.2.3、LVS工作模式总结 …

黑马Java零基础视频教程精华部分_18_Arrays各种方法

系列文章目录 文章目录 系列文章目录Arrays简介Arrays各种方法toString代码示例binarySearch代码示例copyOf代码示例copyOfRange和fill代码示例sort代码示例 Arrays简介 操作数组的工具类。 Arrays各种方法 toString代码示例 int[]arr{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //to…

非线性链表之树结构和堆的代码实现

目录 一.树的结构 1.1树概念及结构 1.2 树的相关概念 1.3 树的表示 二. 二叉树概念及结构 2.1概念 2.2 特殊的二叉树: 2.3 二叉树的性质 2.4 二叉树的存储结构 2.4.1. 顺序存储 ​2.4.2. 链式存储 三. 堆的概念及结构 定义 性质 堆的实现 四.堆的代…

kafka零拷贝sendfile及mmap简述

概述 通常在选型比较消息中间件时,都会在备选栏有kafka; kafka突出的特点就是高吞吐,零拷贝; 这里的零拷贝其实就是内核和用户空间之间没有copy,并不是真的0拷贝; 毕竟数据在磁盘,要读到网卡发…

k8s集群管理 Pod管理命令

k8s集群管理命令 信息查询命令 子命令说明help用于查看命令及子命令的帮助信息cluster-info显示集群的相关配置信息api-resources查看当前服务器上所有的资源对象api-versions查看当前服务器上所有资源对象的版本config管理当前节点上的认证信息 资源对象概述 Pod概述 Pod 管…

# 利刃出鞘_Tomcat 核心原理解析(三)

利刃出鞘_Tomcat 核心原理解析(三) 一、 Tomcat专题 - Tomcat架构 - 启动流程 1、Tomcat 启动流程 2、Tomcat 启动 步骤 : 1) 启动tomcat , 需要调用 bin/startup.bat (在linux 目录下 , 需要调用 bin/startup.sh) &#xff0c…

Dubbo框架实现RPC远程调用包括nacos的配置和初始化

项目背景介绍 这个技术我是直接在项目中运用并且学习的,所以我写笔记最优先的角度就是从项目背景出发 继上一次API网关完成了这个实现用户调用一次接口之后让接口次数增多的操作之后,又迎来了新的问题。 就是我们在调用接口的时候需要对用户进行校验&…

【Linux】详解IPC:共享内存

目录 IPC 共享内存 1.理解 2.运用 1. 创建 ipc - shmget 2. 创建 key - ftok ⭕shmid vs key 3. 连接 - shmat 4. 脱离 - shmdt 5. 控制/删除 - shmctl 总结 代码示例 3.实验 comm.hpp processa.cc processb.cc log.hpp makefile 测试 4.思考 IPC 进程间通…

vue3引入模块报错:无法找到模块“xxx”的声明文件

使用vue3ts导入vue文件的时候,报错:找不到模块“./XXX.vue”或其相应的类型声明 这是由于:Vue 文件并不是标准的 JavaScript 模块,因此 TypeScript 需要通过这种声明方式来理解和处理这些文件 我是使用vite创建的项目&#xff0…

【生信入门linux篇】如何安装一个linux虚拟机用于学习

一.虚拟机 虚拟机(Virtual Machine,简称VM)是一种软件实现的计算机系统,它能够在物理计算机上模拟出多个独立的计算机环境。每个虚拟机都可以运行自己的操作系统和应用程序,就像在独立的物理计算机上一样。虚拟机技术…

小试牛刀-区块链Solana多签账户

目录 1.什么是多签账户 2.多签账户的特点 2.1 多个签名者 2.2 最小签名要求 2.3 常见应用场景 3.多签账户实现 3.1 账户的创建 3.1.1 创建新账户 3.1.2 获取创建和初始账户事务 3.1.3 账户的签名 3.2 代币转移操作 Welcome to Code Blocks blog 本篇文章主要介绍了 …

LeetCode_sql_day16(601.体育馆的人流量)

描述:601. 体育馆的人流量 - 力扣(LeetCode) 编写解决方案找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。 返回按 visit_date 升序排列 的结果表。 输入Stadium表: ----------------------------- | id | visit_date | peop…

电子电气架构 --- 车辆模式管理

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…