Spring源码-refresh(1)

news2024/9/25 17:12:20

1、Refresh方法简介

refresh 是Spring的核心流程,主要包含13个方法。这13个方法中主要又包含3个方法。

如图:

其中标记星号的代表主要的方法。从方法中后面的分支数据也可以看出,主要的方法中存在大量的逻辑处理,后面我们会慢慢分解开来梳理。

本章内容主要梳理前四个方法。

2、prepareRefresh 初始化上下文的环境

2.1 初始化标识
// Switch to active.
this.startupDate = System.currentTimeMillis();
this.closed.set(false);
this.active.set(true);

if (logger.isDebugEnabled()) {
	if (logger.isTraceEnabled()) {
		logger.trace("Refreshing " + this);
	}
	else {
		logger.debug("Refreshing " + getDisplayName());
	}
}

将当前Context环境标记成活跃状态,关闭状态置为false。其中this 就是AnnotationConfigApplicationContext 。如图:

2.2 校验所有的属性并标记
// Initialize any placeholder property sources in the context environment.
initPropertySources();

// Validate that all properties marked as required are resolvable:
// see ConfigurablePropertyResolver#setRequiredProperties
getEnvironment().validateRequiredProperties();

initPropertySources 初始化上下文环境中的placeholder property sources ,主要是被子类实现用,默认空实现。这是一个钩子方法。

getEnvironment() 获取当前的上下文所需要的环境ConfigurableEnvironment 。默认会创建一个标准的环境。此环境可以获取到环境的变量和属性。

validateRequiredProperties() 获取所有的必须的属性,将其保存到MissingRequiredPropertiesException 对象中,如果环境运行,没有检测注册的必要属性就会抛出异常。

2.3 初始化监听器和事件

初始化监听器和事件。为后面发布事件做好准备。

3、obtainFreshBeanFactory()

获取一个内部的BeanFactory

3.1 刷新当前工厂

当前的工厂就是DefaultListableBeanFactoryGenericApplicationContext 的空参构造函数就会创建工厂。

然后设置工厂的唯一标识SerializationId

3.2 返回当前工厂

工厂返回的是一个接口ConfigurableListableBeanFactory ,实现还是3.1 中的DefaultListableBeanFactory

4、prepareBeanFactory()

配置工厂标准环境的一些特性。

该方法大致40行代码左右,主要可以分为5部分:

  • 忽略指定接口

  • 注册解析依赖

  • 添加BeanPostProcessor(BPP)

  • 注册环境默认的单例

  • 其他特性

此分类会打乱该方法部分代码的顺序,部分代码执行会有先后的顺序要求。下面分析将按照分类梳理。

4.1 忽略指定接口
beanFactory.ignoreDependencyInterface(xxxx.class)

忽略的接口有:

  • EnvironmentAware.class

  • EmbeddedValueResolverAware.class

  • ResourceLoaderAware.class

  • ApplicationEventPublisherAware.class

  • MessageSourceAware.class

  • ApplicationContextAware.clas

  • ApplicationStartupAware.class

忽略指定的xxxxAware接口。因为xxxxAware接口是对外提供扩展,将xxxx本身暴露出去。所以BeanFactory处理的时候无需关心这些接口。只要关注实际的xxx接口本身就好了。

4.2 注册解析依赖

BeanFactory.class、ResourceLoader.class、 ApplicationEventPublisher.class、 ApplicationContext.class的处理军依赖当前的Bean工厂,所以建立对应关系。本质上就是维护一个一一对应的map集合。方便使用时直接获取。

4.3 添加BPP

BeanPostProcessor 是Bean初始化的后置处理器。可以再Bean初始化前后增强。

  • new ApplicationContextAwareProcessor(this) 上下文Aware处理器

    Bean初始化之前,处理实现Aware接口的类,为其设置环境和解析器

  • new ApplicationListenerDetector(this) 监听器的探测器

    该类实现了DestructionAwareBeanPostProcessor MergedBeanDefinitionPostProcessor 接口。分别在Bean定义后合并、Bean实例化之后、Bean销毁之前调用。

    如果当前Bean是ApplicationListener 就会执行相应的逻辑。

  • new LoadTimeWeaverAwareProcessor(beanFactory) 编译时的代码织入

    在Bean初始化之前为Bean设置LoadTimeWeaver

4.4 注册默认的单例

注册的单例:

  • environment 标准的配置环境

  • systemProperties 系统属性

  • systemEnvironment 系统的环境

  • applicationStartup 启动的Bean

4.5 其他的特性

为BeanFactory设置其他特性

beanFactory.setBeanClassLoader(getClassLoader());

设置类加载器,用来加载一些配置文件等信息

beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()))

设置Bean的EL表达式的解析器

beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

设置属性编辑注册器。

处理字符串和日期的对应关系时,我们可以注册String和Date的对应关系等。

5、postProcessBeanFactory(beanFactory)

给子类预留的钩子函数,默认空实现。springboot启动的时候就会用到(增加web容器的处理器)。

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

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

相关文章

Android出现app右上角打了小叉叉

解决方法 找到项目文件夹--------找到.idea文件然后删除--------再次从新打开

黄金期货与黄金现货的区别

黄金期货与黄金现货是有区别的,比如在交易机制方面,黄金期货有具体的交割日,合约到期就必须交割,否则会被强行平仓或以实物进行交割,而在保证金不足时也会被强行平仓;而现货黄金就没有交割限制,…

于璠访谈录 | AI 框架应该和而不同?

点击以下链接收听本期 “大咖访谈” 播客,与大咖面对面: 大咖访谈链接:于璠 | AI 框架应该和而不同? 刘天栋:访谈主持,开源雨林社区顾问、开源社联合创始人、ASF member 于璠:访谈嘉宾&#xf…

Redis——哨兵模式与Zookeeper选举的异同点

摘要 当我们使用主从复制出现的问题:手动故障转移:写能力和存储能力受限:主从复制 -master 宕机故障处理。 主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干…

1.qt引入华为鸿蒙字体库

目录 背景下载鸿蒙字体库资源引入使用字体库 背景 因为一些字体是要收费的, 如果使用了,并且商业用途,那么属于侵权行为,那么在此时我们就想要用一些可商用免费开源的字体库,目前华为鸿蒙字体提供了我们一个解决方案&…

MySQL安装后,同局域网其他电脑无法连接问题

MySQL安装后,同局域网其他电脑无法连接问题 1、问题: 在同一个局域网下,笔者电脑安装了MySQL数据库后,出现了其他伙伴想连接笔者电脑的MySQL,而连不上的问题。 2、解决方案 在防火墙中添加开放端口: 第…

MySQL操作命令整理

MySQL操作命令整理 SQL分类 SQL语句按照其功能范围不同可分为3个类别: 数据定义语言(DDL ,Data Defintion Language)语句:数据定义语句,用于定义不同的数据段、数据库、表、列、索引等。常用的语句关键字包括create、drop、alter等。数据操作语言(DML , Data Manipulatio…

如何将R128的lspsram频率提高至200M?

一、修改频率方法 首先通过cboot0命令,跳转到boot0的代码中,路径为: ${root_dir}/lichee/brandy-2.0/spl/ 找到lspsram的代码,路径为: ${root_dir}/lichee/brandy-2.0/spl/drivers/psram 修改头文件,将2…

有奖招募!清华社招募2023年度“荐书官”啦

清华社招募2023年度“荐书官”啦!分享你读过的清华社IT领域好书,就有机会成为“荐书官”,并获得丰厚好礼! 在IT领域,读书破万卷,bug全不见!案头必备一本书,需求来了我不哭&#xff…

记一次红队打的逻辑漏洞(验证码绕过任意用户密码重置)

八月初参加某市演练时遇到一个典型的逻辑漏洞,可以绕过验证码并且重置任意用户的密码。 首先访问页面,用户名处输入账号会回显用户名称,输入admin会回显系统管理员。(hvv的时候蓝队响应太快了,刚把admin的权限拿到了&a…

[毕设记录]@学术工具体验:Sread.ai

我是在查RAG相关的时候,在知乎上面看到了这篇回答:浅谈生成式 AI 技术:检索增强生成 RAG - MarvinZ的文章 - 知乎 https://zhuanlan.zhihu.com/p/659248219 然后在末尾看到了这个 sread.ai 在作者主页看到了他关于这个产品的介绍&#xff1a…

三、机器学习基础知识:Python常用机器学习库(Matplotlib)

文章目录 1、Matplotlib2、基本结构3、pyplot模块3.1 pyplot.plot()函数的使用3.2 其他常见属性设置3.3 子图的绘制 4、其他类型的图表4.1 竖向条形图4.2 散点图4.3 饼图 1、Matplotlib matplotib库中有非常多的可视化绘图类,内部结构复杂。受 MATLAB 提供的绘图功…

任正非说:扩张必须踩在坚实的基础上,擅自扩张只能是自杀。

嗨,你好!这是华研荟【任正非说】系列的第23篇文章,让我们继续聆听任正非先生的真知灼见,学习华为的管理思想和管理理念。 一、要想赢,要么在剑法上高于人,要么在盾牌上坚于人。若果剑不如人,就要…

关于基站能耗监控解决方案的应用探讨-安科瑞 蒋静

摘 要:随着社会的不断发展和进步,人们对通信基站的需求增加。随着通信基站大规模的建设和使用,基站内部的电源情况、供电安全保障或节能减排等问题,仍然是基站建设的着重问题。不管是建设者还是使用者,都应当注重用电…

使用Process Explorer/Process Hacker和Windbg排查软件高CPU占用问题

目录 1、问题说明 2、Process Explorer与Windbg工具介绍 2.1、Process Explorer工具 2.2、Windbg调试器 3、引发程序高CPU占用的原因分析 4、在任务管理器和Process Explorer中查看目标程序的CPU占用 5、使用Process Explorer和Process Hacker查看占用CPU高的线程 5.1、…

安装 MySQL 服务时提示 Install/Remove of the Service Denied

安装 MySQL 服务时提示 Install/Remove of the Service Denied 1. 概述1.1 问题1.2 没有 MySQL 服务的时候 2. 解决方法 1. 概述 1.1 问题 在安装 MySQL-8.0.25-winx64 的 MySQL 服务时遇到了以下提示: 安装 MySQL 服务时提示:、 Install/Remove of t…

【c++|opencv】一、基础操作---3.访问图像元素

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 访问图像元素 1. 访问图像像素 1.1 访问某像素 //灰度图像&#xff1a; image.at<uchar>(j, i) //j为行数&#xff0c;i为列数 //BGR彩色图像 i…

清华 ChatGLM-6B 中文对话模型部署简易教程

本文目录 一、前言二、下载三、部署3.1 配置环境3.2 启动 demo 程序3.2.1 启动 cli_demo.py3.2.2 启动 web_demo.py 四、【最新】ChatGLM-6B-int4 版本教程4.1 下载4.2 配置环境4.3 启动 demo 程序 五、华为 CodeLab 免费 GPU 平台部署 ChatGLM-6B-int4&#xff08;CPU版&#…

移植wpa_supplicant及简单使用

嵌入式环境下的设备有时会需要能连接到外网进行一些数据的交互&#xff0c;通过利用wpa_supplicant客户端结合有线网卡或无线网卡&#xff0c;即可配置好网络达到目的。 资源&#xff1a;openssl-0.9.8e.tar.gz wpa_supplicant-0.7.3.tar.gz 源代码下载路径一&#xff1a;http…

激光雷达,被降本“牺牲”?

激光雷达&#xff0c;正在成为车企「价格战」的牺牲品。尤其是纯视觉方案带来的巨大显性降本效应&#xff0c;开始动摇车企的传感器配置策略。 本周&#xff0c;随着极越01的上市&#xff0c;相比去年发布的探月版车型39.98万的定价&#xff0c;大幅下降至24.99-33.99万&#…