Spring源码-refresh(1)

7-Spring源码解析之refresh(1)——概览 上一篇:Spring容器创建(3)——register注册配置类 上一篇我们讲到执行完register()方法, public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { // 1. 首先初始化Spring的7个内置Bean后置处理器,并放到 DefaultListableBeanFacto... 阅读详情

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 刷新当前工厂

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

然后设置工厂的唯一标识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容器的处理器)。

1.5 一行 refresh(),撑起整个 Spring:IoC 容器启动全链路源码拆解 Spring IoC 容器启动核心流程解析 本文深入解析 Spring 容器启动的核心方法 refresh() 的12个关键步骤: 容器准备阶段 - 记录启动时间、设置状态、初始化属性源 获取BeanFactory - 创建或刷新底层容器结构 配置标准特性 - 设置类加载器、EL解析器等 子类扩展点 - 允许子类自定义BeanFactory配置 后置处理器执行 - 处理配置类、组件扫描等 注册Bean后处理器 - 为后续Bean实例化做准备 国际化支持 - 初始化消息源组件 事件机制 - 设置事件广播器 子 阅读详情

相关推荐

Spring 完整实现流程、完整源码分析

前言 Spring这个框架相当于说我们做JAVA服务端开发的人员是必备的框架,那么在面试的时候Spring也是无法逃脱的,说到Spring那么就不得不提IOC和AOP,往往我们分析Spring的源码的时候都是直接切入refresh()方法,而忽略了一些其他的细节,当然refresh()方法也很重要,那么本文作文Spring整个框架源码分析的一个聚合,不单是只分析refresh()方法中调用的方法,还会分析整个Spring启动的过程! 环境准备 本文代码环境基于Spring5.1.5,基本依赖如下 依赖准备

程序员劝退师的博客 1093

Spring源码 06 IOC refresh方法1

*** 1 刷新前的准备工作* 设置容器的启动时间* 设置关闭状态为 false* 设置活跃状态为 true* 获取 Environment 对象,并加载当前系统的属性值到 Environment 对象中并进行验证* 准备监听器和事件的集合对象,默认为空的集合*/// 设置容器启动时间// 容器的关闭标志位// 容器的激活标志位// 记录日志else {// 留给子类覆盖,初始化属性资源// 获取环境对象// 验证需要的属性文件是否都已经放入环境中。

天河有尽后为涯,星海无边前作岸。 168

WGCNA加权基因共表达网络分析(1)简介、原理

WGCNA简介 WGCNA(Weighted Gene Co-Expression Network Analysis, 加权基因共表达网络分析),鉴定表达模式相似的基因集合(module),解析基因集合与样品表型之间的联系,绘制基因集合之间的调控网络并鉴定关键调控基因 WGCNA适用于复杂的转录组数据(样本数目较多) 研究不同器官/组织类型和不同阶段的发育调控、生物和非生物胁迫的不同时间响应机制 WGCNA原理 原理概要 1.构建基因共表达网络:先构建基因共表达网络,通常利用两两基因之间的表达模式来计算

qq_44520665的博客 3万+

Spring源码学习(三):容器ApplicationContext的refresh(1)

文章目录前言一、Springboot中的refreshContext二、AbstractApplicationContext的refresh1.引入库2.读入数据总结 前言 第一篇地址,主要讲ApplicationContext的初始化-create:Spring源码学习(一):Spring容器创建和初始化工作准备 第二篇地址,主要讲ApplicationContext的准备工作-prepare:Spring源码学习(二):Spring容器之prepareContext和BeanFactoryPostPr

liangsheng_g的专栏 481

保姆级教程:断网环境下用Flexnet服务器搞定SolidWorks 2021安装与破解(附错误5解决方案)

本文提供SolidWorks 2021在断网环境下的企业级部署指南,详细解析Flexnet服务器本地化工作原理,并给出安装与破解的实战方案,特别针对常见的'错误5'问题提供多维度解决方案。适用于需要内网隔离或移动办公的工业设计场景,确保数据安全与授权合规。

weixin_28683391的博客 302

DC/DC开关电源学习笔记(十三)Buck-Boost升降压电路工作原理

Buck-Boost电路是一种能够实现输出电压高于或低于输入电压的DC-DC变换器,且输出电压极性与输入电压相反。它结合了Buck(降压)和Boost(升压)两种拓扑的特点,广泛应用于需要灵活电压调整的场合,如电池供电设备、LED驱动和工业控制系统。本文将从电路结构、工作原理、关键公式推导及实际应用等方面进行详细分析。

小幽余生不加糖 3508

spring源码分析之架构和Refresh v1.0

3.普通的spring mvc的工程入口是spring-webmvc模块的FrameworkServlet.initServletBean()方法创建WebApplicationContext,即XmlWebApplicationContext,调用WebApplicationContext.refresh()方法.注意看import-into-idea.md文件.先执行gradlew :spring-oxm:compileTestJava.再执行gradlew idea -x test.

研究源码的最底层,只持有正确的仓位 340

微信小程序 - 解决web-view嵌套H5网页白屏问题,将h5网页嵌套在webview页面出现无法加载一片空白,详解微信小程序<web-view>页面跳转出现白屏情况(无论本地还是线上H5都能解决)

微信小程序解决web-view打开网页在手机上出现白屏的问题,小程序web-view嵌套H5项目白屏问题分析及解决,使用web-view组件加载H5网页链接后白屏情况,小程序嵌套的h5网页中跳转页面时也有可能出现白屏问题,嵌套webview页面时,出现白屏,WebView 加载不出网页,微信小程序<web-view>页面跳转出现白屏解决方法,解决WebView白屏空白,H5内嵌第三方小程序打开白屏,微信小程序嵌入h5页面加载空白,微信小程序web-view跳转h5白屏,解决微信小程序web-view打开网页

🏆 前端领域优质创作者 1万+

Spring 4.x 源码系列1-ApplicationContext refresh 刷新

一、前沿 Spring 是java后台开发人员再熟悉不过的框架,其中有一个好处就是通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码 造成程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用,真正实现了写一次,可以到处运行的机制 既然 Spring 是管理bean的容器,那么它是如何...

大龙的博客 848

【第一章】基于Simulink的控制器开发教程——目录

摘要:本文系统介绍了基于Simulink的控制器开发方法,涵盖PID、状态反馈、模型预测(MPC)、模糊控制、自适应控制等8类主流控制器。针对每种控制器,详细阐述了其基本原理、适用场景,并通过Simulink建模与仿真测试进行实践验证。文章采用"理论+实践"的结构,从算法设计到硬件实现全流程展开,为汽车、航空航天、工业控制等领域的控制器开发提供完整解决方案,最后通过应用对比与学习总结帮助读者掌握不同控制器的核心特性和应用场景。(149字)

熟悉MATLAB/fpga/RK3588/LABVIEW/protus/单片机/dsp/Multisim 394

R语言生存分析之限制性立方样条分析:样条回归、和多项式回归有什么不同?是否存在非线性关系、限制性立方样条cox回归模型

R语言生存分析之限制性立方样条分析:样条回归、和多项式回归有什么不同?是否存在非线性关系、限制性立方样条cox回归模型

statistics+insight+vista+power 635

Spring5 源码阅读笔记(1)refresh() 刷新

入口 private ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); 有了 applicationContet 之后,就可进行 getBean(beanName) 操作。 与 ClassPathXmlApplicationContext 平行的还有: FileSy...

日有寸进 561

辐射制冷无规散射结构非球形散射体的结构优化与设计准则

本文针对辐射制冷材料中非球形散射体的光散射特性开展研究,提出了一种基于体积散射截面和不对称因子的综合评价方法。通过建立简化模型分析球体、圆柱体、长方体等六种几何形状在太阳波段的散射性能,发现金字塔形和圆锥形具有更强的后向散射能力。研究创新性地提出"反射因子SR=S(1-g)"这一评价参数,该参数与宏观反射率高度相关,为非球形散射体的优化设计提供了定量依据。仿真结果表明,合理选择散射体形状可显著提升辐射制冷材料的太阳反射率,为实现高效被动制冷提供了新的结构设计思路。

huanghm88的专栏 83

spring4.1.8初始化源码学习三部曲之三:AbstractApplicationContext.refresh

本章是《spring4.1.8初始化源码学习三部曲》系列的终篇,重点是学习AbstractApplicationContext类的refresh()方法;我们先回顾ClassPathX...

程序员欣宸的博客 599

“/usr/lib/wsl/wsl-setup“ failed, exiting

WSL2安装Ubuntu时出现"wsl-setup failed"错误的解决方法 摘要:当Windows用户名包含中文字符时,安装WSL2+Ubuntu会出现"wsl-setup failed"错误。本文提供两种解决方案:1)修改中文用户名(风险较大);2)通过命令手动配置。推荐第二种方法:先使用"wsl -l -v"查看Ubuntu名称,再通过"wsl -d Ubuntu20.04 -e /bin/bash"命令启动WSL2系

猿小白的博客 1000

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

10-Spring源码解析之refresh(4)——invokeBeanFactoryPostProcessors(1)

上一篇:9-Spring容器创建之refresh(3)——【prepareBeanFactory】与【postProcessBeanFactory】 上篇文章讲的是refresh方法中调用的第三个方法prepareBeanFactory和第四个方法postProcessBeanFactory, 本篇文章我们来接着介绍refresh的第五个方法,也是非常重要的方法:invokeBeanFactory...

想当厨子的程序媛 1223

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

spring4.1.8初始化源码学习三部曲之三:AbstractApplicationContext.refresh方法

本章是《spring4.1.8初始化源码学习三部曲》系列的终篇,重点是学习AbstractApplicationContext类的refresh()方法; 原文地址:https://blog.youkuaiyun.com/boling_cavalry/article/details/81045637 我们先回顾ClassPathXmlApplicationContext类的初始化过程如下代码: publ...

程序员欣宸的博客 7035

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

spring源码解析(四):refresh()中obtainFreshBeanFactory()(1、解析spring.xml)

文章目录spring refresh()中obtainFreshBeanFactory()之parseCustomElement详解一、parseBeanDefinitions():解析配置文件spring.xml二、parseCustomElement():命名空间节点的解析1. resolve()1.1、getHandlerMappings():获取配置文件中的所有命名空间对应的handler...

L的追寻 496

做一个合格的程序猿之浅析Spring IoC源码(十一)Spring refresh()方法解析后记1

上次分析refresh这块spring IoC的时候,时间比较仓促,只是debug了部分源码,大家分析起来不是很好~ 今天我们还是先总结一下吧~ spring在实例化bean的时候,根据bean实现的接口不同,bean的实例化也是有先后顺序的 由于此块代码太多,贴图给大家的学习的效果不好,现在以spring 3.2.5源代码为例,大家再一份“温故”一下,然后“知新”

BazingaLyncc 2614

Ioc容器refresh总结(1)--- Spring源码从入门到精通(三十一)

上篇文章主要介绍了EventListener注解的使用及源码分析: 注解是由EventListenerMethodProcessor后置处理器里的afterSingletonsInstantiated方法,而这个方法顾名思义,在单实例对象初始化之触发的,全部都在ioc容器refresh方法里面。 @EventListener--- Spring源码从入门到精通(三十) 这篇文章主要介绍refresh方法: 一、prepareRefresh() initPropertySources刷新前的预处

ke1ying的博客 354

SpringIOC源码解析一

准备 将spring5.1源码导入到idea编写几个测试类 public class Main { public static void main(String[] args) { ApplicationContext app = new ClassPathXmlApplicationContext("spring.xml"); Text02 text02= (Text02)ap...

weixin_42077407的博客 256

通过ClassPathXmlApplicationContext源码解读Spring启动过程

通过ClassPathXmlApplicationContext源码解读Spring启动过程 @(Spring)[Spring][源码] 注:本次分析基于spring-context-5.1.0.RC1.jar 通过ClassPathXmlApplicationContext源码解读Spring启动过程 类关系 入口函数 解读refresh方法 prepareRefresh() ...

Loong 1656

SpringBoot源码解析 事件分发(Event)机制实现

事件分发机制源码阅读。

我只是无聊 1669

Spring IoC 容器初始化全链路深度解析:从 BeanFactory 到 refresh() 的底层真相

## 5.1 对比总览| 维度 | BeanFactoryPostProcessor | BeanPostProcessor ||------|--------------------------|-------------------||### 2.2 BeanFactory vs ApplicationContext 对比| 特性 | BeanFactory | ApplicationContext ||------|-------------|-------------------||

m0_57877510的博客 412

Spring启动流程解析,基于ClassPathXmlApplicationContext

长文警告! 此文章仅仅讲述主方法以及主方法里面方法的解释,不会贴太多代码,要仔细了解还得读者自己去看源码哈.基于Spring5.1.3RELEASE 一.基础代码 1.基础的项目目录截图如下 2.bean.xml <bean class="com.lixiao.stydy.spring.domain.Student" id="lixiao"> <property name="name" value="李校"></property>

weixin_40565846的博客 512
上一篇: Spring源码解析-注册配置信息
下一篇: myabtis流式查询
智_永无止境
博客等级 码龄10年 803粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值