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.唯一…

国产服务器安装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…

微信小程序之投票管理

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

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

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

数据结构基础

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数字孪生智慧工厂三维可视化系统解决方案,打造新一代智慧工厂

在制造业的快速发展和数字化转型的时代,智慧工厂已经成为制造企业前进的必经之路。数字孪生技术,作为工业数字化转型的核心动力,为打造智慧工厂提供了关键支持。其中,数字孪生智慧工厂三维可视化系统解决方案无疑是制造企业的得力…

2023深耕kotlin,谈谈前景

为什么学习kotlin? Kotlin 早就已经是 Google 官方推荐的开发语言了,而且 Android 新的 Compose 框架只支持 Kotlin ,在 Google 那里,Android开发中 Java 其实已经被淘汰了。Java 和 Kotlin 虽然都属于高级语言,但是 …