【spring】AbstractApplicationContext 的refresh() 方法学习

 上一篇我们一起学习了【spring】FileSystemXmlApplicationContext 类学习

AbstractApplicationContext 的refresh() 方法介绍

AbstractApplicationContextrefresh()方法仍然是整个Spring应用程序上下文初始化的核心流程入口。大体上的刷新生命周期依然保持一致。

refresh() 方法的执行流程是一个复杂的过程,它涉及到多个方法的调用和多个步骤的执行。在实际开发中,我们通常不需要直接调用 refresh() 方法,而是通过调用 AbstractApplicationContext 类的子类的 refresh() 方法来刷新应用上下文。

源码截图

注释后的源码


public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// 调用容器准备刷新,获取容器的当前时间,同时给容器设置同步标识prepareRefresh();// 告诉子类启动 refreshBeanFactory() 方法,BeanDefinition 资源文件的载入从子类的 refreshBeanFactory() 方法启动开始ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// 为 BeanFactory 配置容器特性,例如类加载器、事件处理器等prepareBeanFactory(beanFactory);try {// 为容器的某些子类指定特殊的 BeanPost 事件处理器postProcessBeanFactory(beanFactory);// 调用所有注册的 BeanFactoryPostProcessor 的 BeaninvokeBeanFactoryPostProcessors(beanFactory);// 为 BeanFactory 注册 BeanPost 事件处理器.// BeanPostProcessor 是 Bean 后置处理器,用于监听容器触发的事件registerBeanPostProcessors(beanFactory);// 初始化信息源,和国际化相关.initMessageSource();// 初始化容器事件传播器initApplicationEventMulticaster();// 调用子类的某些特殊 Bean 初始化方法onRefresh();// 为事件传播器注册事件监听器.registerListeners();// 初始化 Bean,并对 lazy-init 属性进行处理finishBeanFactoryInitialization(beanFactory);// 初始化容器的生命周期事件处理器,并发布容器的生命周期事件finishRefresh();}catch (BeansException ex) {// 销毁以创建的单态 BeandestroyBeans();// 取消 refresh 操作,重置容器的同步标识.cancelRefresh(ex);throw ex;}}
}

对上面代码的解释

  1. prepareRefresh():做一些刷新前的准备工作,例如设置启动时间戳等。

  2. obtainFreshBeanFactory():获取或创建一个新的ConfigurableListableBeanFactory,它是Spring容器的基础,用于存储和管理Bean的定义与实例。

  3. prepareBeanFactory(beanFactory):对BeanFactory进行必要的配置,包括设置默认属性、添加系统属性以及设置类加载器等。

  4. postProcessBeanFactory(beanFactory):允许子类对BeanFactory进行额外的后期处理。

  5. invokeBeanFactoryPostProcessors(beanFactory):调用BeanFactory后处理器,它们可以修改BeanDefinition对象,影响容器内Bean的定义和初始化。

  6. registerBeanPostProcessors(beanFactory):注册Bean后处理器,这些处理器可以在Bean实例化前后进行拦截处理。

  7. initMessageSource() 和 initApplicationEventMulticaster():分别初始化国际化消息源和应用事件广播器。

  8. onRefresh():提供给子类覆盖,以便在刷新过程中执行特定的初始化动作。

  9. registerListeners():注册监听器,这些监听器会在容器中监听特定的事件。

  10. finishBeanFactoryInitialization(beanFactory):完成剩余所有非懒加载的单例Bean的初始化工作。

  11. finishRefresh():刷新过程的最后阶段,发布一个ContextRefreshedEvent事件,表示ApplicationContext已完成刷新,并且所有Bean都已准备好使用。




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

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

相关文章

【IEEE ACCESS】论文发表记录

官网:IEEE Access:多学科开放获取期刊 期刊水平: IEEE Access - 中国科学院文献情报中心期刊分区表升级版 (fenqubiao.com) 时间轴: 第一次提交:2024 年 1 月 17 日 第一次结果:2024 年 2 月 27 日 拒…

牛市亏钱的原因

在2015年牛市,许多不炒股的人因为牛市被老股民赚钱效应吸引,1天赚一个月的工资的故事开始流传。于是这些人开始入场买股票了。 开始,这些人投的很少,找赚了一笔,吃到甜头后,开始加大资金投入,继…

为什么网页提示SSL证书不信任?

随着传统行业迅速融入互联网,信息安全问题逐渐凸显,企业商业机密和国家信息安全面临网络威胁。为应对此挑战,国内企业已积极部署SSL证书,强化信息安全防护,确保业务安全稳定运行。 在企业部署SSL证书的过程中&#xf…

网络服务练习题

综合练习:请给 openlab 搭建 web 网站 网站需求: 1. 基于域名 www.openlab.com 可以访问网站内容为 welcome to openlab!!! 2. 给该公司创建三个子界面分别显示学生信息,教学资料 和缴费网站,基于, www.openlab.c…

面向对象:继承

文章目录 一、什么叫继承?二、单继承三、多继承3.1多继承的各种情况3.1.1一般情况3.1.1特殊情况(菱形继承) 四、菱形继承引发的问题4.1 问题1:数据冗余4.2 问题2:二义性(无法确定到底是访问哪个) 五、虚拟继承解决菱形…

Java毕业设计-基于springboot开发的原创歌曲分享平台-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、平台功能模块2、后台功能模块2.1管理员功能模块2.2用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开…

威联通安装Kafka

最近在学习 Kafka 的知识,遇到一些问题网上搜到的信息不全。想要在本地安装一个 Kafka 进行验证,想到了之前买的 Nas 就开始折腾。 用 Docker 的方式安装 Kafka 现在的 Nas 很多都支持 Docker,我买的也支持。威联通的 Docker 叫 Container S…

基于vue的MOBA类游戏攻略分享平台的设计与实现|Springboot+Vue+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文(设计)学生选题参考合集推荐收藏(包含Springboot、jsp、ssmvue等技术项目合集) 目录 1. …

Leo赠书活动-22期 【大模型在金融行业的应用场景和落地路径】文末送书

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 赠书活动专栏 ✨特色专栏:…

深入探索C++对象模型(二)

类对象占用的空间 #include "pch.h" #include <iostream> using namespace std;class A {public: };//类对象所占用的空间 int main() {//std::cout << "Hello World!\n"; A obja;int ilen = sizeof(obja); cout << ilen << endl…

Go的数据结构与实现【Stack】

介绍 栈是存放值的一种特殊容器&#xff0c;在插入与删除值时&#xff0c;这种结构遵循后进先出&#xff08;Last-in-first-out&#xff0c;LIFO&#xff09;的原则&#xff0c;也就是说&#xff0c;值可以任意插入栈中&#xff0c;但每次取出的都是此前插入的最后一个值。 实…

Linux:详解TCP协议段格式

文章目录 认识TCPTCP协议段格式 本篇主要总结的是TCP协议的一些字段 认识TCP TCP协议全称是传输控制协议&#xff0c;也就是说是要对于数据的传输进行一个控制 以上所示的是对于TCP协议进行数据传输的一个理解过程 全双工 至此就可以对于TCP协议是全双工的来进行理解了&…

纸上得来终觉浅->代码详解锁升级

背景 最近再看关于锁升级的内容&#xff0c;一方面这个是编写代码时程序性能提高的一个利器&#xff0c;另一方面这部分也会是面试时候的热门话题。那么作者最开始也是通过b站视频包括一些csdn上面的资料去看&#xff0c;最终发现只是有一些结论&#xff0c;而没有具体的例子。…

为何视频订阅者倾向于长期关注:深度探讨用户粘性现象

在当今的数字化时代&#xff0c;视频平台已经成为人们获取信息、娱乐休闲的重要渠道。观察发现&#xff0c;许多用户一旦对某个视频创作者进行关注&#xff0c;往往较少出现主动取关的现象。这一现象背后隐藏着用户行为习惯、内容价值认知以及社区归属感等多种因素的影响&#…

​python学习之变量类型​

print单纯输中的十种数据类型只需要用print()函数即可&#xff0c;()里面直接写变量名。 下面重点介绍print格式输出&#xff1a; 第一种方法&#xff1a;一个萝卜一个坑&#xff0c;下面的代码中&#xff0c;{0}、{1}、{2}分别表示j,i,j*i&#xff0c;单引号里面是输出格式。…

【Webflux】实现全局返回Long转String

基于spring webflux框架,而非springmvc @Configuration public class LongToStringConfig {@Beanpublic ObjectMapper objectMapper() {ObjectMapper objectMapper = new ObjectMapper();SimpleModule simpleModule = new SimpleModule();simpleModule.addSerializer(Long.cla…

什么是土壤墒情检测站?它在农业生产中有什么作用?

土壤墒情检测站是一种专门用于监测土壤水分状况和土壤水力性质的设备。它由多个传感器和数据采集单元组成&#xff0c;能够实时监测土壤中的水分含量、土壤温度等参数&#xff0c;并收集和记录相关的数据&#xff0c;提供土壤墒情&#xff08;即土壤水分状态&#xff09;的详细…

Python教程:一文掌握Python多线程(很详细)

目录 1.什么是多线程&#xff1f; 1.1多线程与单线程的区别 1.2 Python 中的多线程实现方式 2.使用 threading 模块创建和管理线程 2.1创建线程&#xff1a;Thread 类的基本用法 2.2线程的启动和执行&#xff1a;start() 方法 2.3线程的同步和阻塞&#xff1a;join() 方…

2024年华为OD机试真题-图像物体的边界-Java-OD统一考试(C卷)

题目描述: 给定一个二维数组M行N列,二维数组里的数字代表图片的像素,为了简化问题,仅包含像素1和5两种像素,每种像素代表一个物体,2个物体相邻的格子为边界,求像素1代表的物体的边界个数。 像素1代表的物体的边界指与像素5相邻的像素1的格子,边界相邻的属于同一个边界,…

docker 安装Sentinel

1.拉取镜像&#xff1a;docker pull bladex/sentinel-dashboard 2.运行镜像&#xff1a;docker run --name sentinel -d -p 8858:8858 -d bladex/sentinel-dashboard 3. 访问地址&#xff1a; 本地地址&#xff1a;http://localhost:8858 (默认端口为8080) 远程地址&#xf…