Spring源码-refresh(1)

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.mzph.cn/news/124159.shtml

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

相关文章

SQL-正则表达式和约束

文章目录 主要内容一.正则表达式1.操作1代码如下(示例): 2.操作2代码如下(示例): 3.操作3代码如下(示例): 4.操作4代码如下(示例): 二.约束1.主键约束 2.自增长约束3.非空约束4.唯一…

mysql 操作慢查询日志

1、mysql 批量插入300w数据 CREATE PROCEDURE test_insert_200w() BEGINDECLARE i INT;SET i1;WHILE i<3000000 DOINSERT INTO shop_user (password, telephone, username) VALUES (admin, 15510304125, concat(admin, i));SET ii1;END WHILE; END; //执行sql call test_in…

国产服务器安装onlyoffice详细教程

1.通过docker安装onlyoffice 找一台能访问互联网的服务器下载onlyoffice镜像 sudo docker pull onlyoffice/documentserver查看镜像 docker images 启动onlyoffice docker run -itd \ --name onlyoffice1 \ --restart always \ -p 8099:80 \ -v /data/docker/onlyoffice/lo…

微信小程序之投票管理

前言 对于会议管理模块&#xff0c;必不可少的当然就是我们的投票管理&#xff0c;实现真正意义上的无纸化办公&#xff0c;本期博客为大家介绍会议管理模块&#xff0c;包括发布投票及查看各类投票的状态 所用技术点 MyBatis、SpringMVC、VentUI MyBatis和SpringMVC在博客主…

最新发布!阿里云卓越架构框架重磅升级

云布道师 10 月 19 日阿里云峰会山东上&#xff0c;阿里云重磅升级《阿里云卓越架构白皮书》&#xff0c;助力企业在阿里云上构建更加安全、高效、稳定的云架构。《阿里云卓越架构白皮书》在今年的阿里云峰会粤港澳大湾区首度亮相&#xff0c;这是阿里云基于多年服务各行各业客…

数据结构基础

在计算机科学中&#xff0c;数据结构是一种数据组织、管理和存储的格式&#xff0c;它可以帮助我们实现对数据高效的访问和修改&#xff0c;更准确的说&#xff0c;数据结构是数据值的集合&#xff0c;它可以体现数据值之间的关系&#xff0c;以及可以对数据进行应用的函数或操…

word行内插入mathtype 公式后行距变大解决办法

现象 word行内插入mathtype 公式后行距变大 解决方法 选中要进行操作的那些行&#xff0c;依次单击菜单命令“格式→段落”&#xff0c;打开“段落”对话框&#xff1b;单击“缩进和间距”选项卡&#xff0c;将间距的“段前”和“段后”都调整为“0行”&#xff1b;将“如果…

C# 图解教程 第5版 —— 第13章 数组

文章目录 13.1 数组13.1.1 定义13.1.2 重要细节 13.2 数组的类型13.3 数组是对象13.4 一维数组和矩形数组13.5 实例化一维数组或矩形数组13.6 访问数组元素&#xff08;*&#xff09;13.7 初始化数组13.7.1 显示初始化一维数组13.7.2 显示初始化矩形数组13.7.3 初始化矩形数组的…

订水商城H5实战教程-05权限控制

目录 1 判断用户是否登录2 创建事件流3 获取不到Userid的问题4 权限控制整体效果 我们上一篇讲解了用户注册的功能&#xff0c;当用户注册完毕的时候再次打开小程序的时候就需要验证权限。权限分为两类&#xff0c;第一类是判断用户是否注册&#xff0c;第二类是当前用户具备什…

3D RPG Course | Core 学习日记二:PolyBrush / Pro Builder构建场景

前言 我们这次将要学习的是使用PolyBrush和Pro Buillder构建精美的游戏场景。 PolyBrush 在Package Manager中导入的时候要注意&#xff0c;将Shader Examples(URP)也一起导入&#xff0c;不然PolyBrush对URP渲染的素材进行操作时会出现问题。 导入完成之后在Tools里将…

【智能座舱系列】- 深度解密小米Hyper OS,华为HarmonyOS区别

上一篇文章《小米的澎湃OS到底牛不牛?与鸿蒙系统之间差距有多大》,从多个方面比较了小米Hyper OS 与 华为HarmonyOS的区别,本篇文章继续从架构层面深度解读两者本质的区别。 小米澎湃OS是“以人为中心,打造人车家全生态操作系统”,该系统基于深度进化的Android以及自研的V…

C/C++网络编程基础知识超详细讲解第二部分(系统性学习day12)

懒大王感谢大家的关注和三连支持~ 目录 前言 一、UDP编程 UDP特点&#xff1a; UDP框架: UDP函数学习 发送端代码案例如下&#xff1a; 二、多路复用 前提讲述 select poll 三、图解如下 总结 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;…

7 款用于解锁iPhone密码的苹果解锁软件

无法访问您的 iPhone 一定是最烦人的情况之一。 即使您以前从未遇到过这种情况&#xff0c;做好准备总是一个好主意&#xff0c;而不是在它发生时感到无助。事实上&#xff0c;这种情况经常发生并且可能有很多实例&#xff0c;例如忘记密码或购买锁定的二手 iPhone。 牢记 Ap…

LeetCode 面试题 16.08. 整数的英语表示

文章目录 一、题目二、C# 题解 一、题目 给定一个整数&#xff0c;打印该整数的英文描述。 示例 1: 输入: 123 输出: “One Hundred Twenty Three” 示例 2: 输入: 12345 输出: “Twelve Thousand Three Hundred Forty Five” 示例 3: 输入: 1234567 输出: “One Million Two …

表白墙/留言墙 —— 初级SpringBoot项目,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信你对这篇博客也感兴趣o (ˉ▽ˉ&#xff1b;) 用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证&#xff08;带前后端源码&#xff09;全方位全流程超详细教程 目录 项目前端页面展…

CTFHub | MySQL流量、Redis流量、MongoDB流量的WriteUp

文章目录 MySQL流量题目题解 Redis流量题目题解 MongoDB流量题目题解 数据库类流量题需要用到Wireshark截取数据包&#xff0c;然后进行分析。 WireShark是非常流行的网络封包分析工具&#xff0c;可以截取各种网络数据包&#xff0c;并显示数据包详细信息。常用于开发测试过程…

python采集电商jd app搜索商品数据(2023-10-30)

一、技术要点&#xff1a; 1、cookie可以从手机app端用charles抓包获取&#xff1b; 2、无需安装nodejs&#xff0c;纯python源码&#xff1b; 3、搜索接口为&#xff1a;functionIdsearch&#xff1b; 4、clientVersion "10.1.4"同时也支持更高的版本&#xff1b; …

“道法自然——徐铭中国画展”在中国美术馆隆重开幕

10月28日上午&#xff0c;“道法自然——徐铭中国画作品展”在中国美术馆隆重开幕。本次展览由中国科学院大学、民盟中央美术院联合主办。第十四届全国人大常委会委员、财政经济委员会副主任委员、民盟中央副主席谢经荣&#xff0c;第十四届全国政协副秘书长、民盟中央副主席、…