spring 源码通过xml方式容器刷新前的准备

Spring源码深度解析:把框架核心讲透,让面试官刮目相看 本文深入解析Spring框架的核心原理,聚焦IOC容器和AOP切面编程两大核心机制。文章首先通过对比传统开发模式与Spring模式,阐释IOC控制反转的核心思想及其优势:降低耦合度、提高可测试性和扩展性。随后介绍AOP面向切面编程的概念,说明其如何通过非侵入方式实现功能增强,解决代码重复问题。文章采用图文并茂的方式,旨在帮助开发者从源码层面理解Spring框架的设计思想,为面试和实际开发提供深度指导。 阅读详情

简介

spring大体可以分为两个路线,一个是容器(DefaultSingletonBeanRegistry),一个是应用上下文(ApplicationContext),它们都是子BeanFactory的实现

  1. DefaultSingletonBeanRegistry 用于缓存bean定义信息及bean
  2. ApplicationContext 上下文,用于保存spring应用过程的信息

接下来是以XML解析的方式深入探索

源码还没有构建的可以参考
在这里插入图片描述

ClassPathXmlApplicationContext xml解析应用上下文

public ClassPathXmlApplicationContext(
			String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
			throws BeansException {
	//指定父容器
	super(parent);
	//设置加载文件
	setConfigLocations(configLocations);
	if (refresh) {
		//开始刷新容器
		refresh();
	}
}

refresh() 开始刷新容器

刷新容器基本包括这些步骤

  1. 获得容器
  2. 加载Bean定义信息(创新Bean必要的信息)
  3. 执行BFPP(Bean定义信息后置处理器)
  4. 注册BFPP(Bean的后置处理器)
  5. Bean的实例化
  6. 填充属性
  7. 执行Aware接口
  8. 执行BPP before方法
  9. 初始化
  10. 执行BPP after方法
  11. 销毁bean

那么咱们先看下获得容器

prepareRefresh(); 启动容器前准备

启动前准备有这几个作用

  1. 设置启动时间
  2. 设置启动和关闭标识
  3. 准备环境
  4. 准备应用监听及事件
// AbstractApplicationContext.prepareRefresh
protected void prepareRefresh() {
	// 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());
		}
	}
	//供子类扩展
	initPropertySources();
	//准备环境
	getEnvironment().validateRequiredProperties();
	//准备应用监听及事件
	if (this.earlyApplicationListeners == null) {
		this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
	}
	else {
		this.applicationListeners.clear();
		this.applicationListeners.addAll(this.earlyApplicationListeners);
	}
	this.earlyApplicationEvents = new LinkedHashSet<>();
}

obtainFreshBeanFactory 获取容器

容器刷新主要做了这些事情

  1. 获得一个新的容器
  2. 设置容器表示
  3. 定制化工厂(属性覆盖,循环依赖)
  4. 加载Bean定义信息
protected final void refreshBeanFactory() throws BeansException {
	//存在bean工厂销毁
	if (hasBeanFactory()) {
		destroyBeans();
		closeBeanFactory();
	}
	try {
		//获取新的工厂
		DefaultListableBeanFactory beanFactory = createBeanFactory();
		//设置标示
		beanFactory.setSerializationId(getId());
		//定制化工厂(是否允许属性覆盖,是否允许循环依赖)
		customizeBeanFactory(beanFactory);
		//加载bean的定义信息
		loadBeanDefinitions(beanFactory);
		this.beanFactory = beanFactory;
	}
	catch (IOException ex) {
		throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
	}
}

加载Bean定义信息是Spring中非常重要的环节,咱们下篇深入了解loadBeanDefinitions(beanFactory)方法实现

Spring源码-容器初始化与刷新 Spring容器启动 简单理解spring框架,首先就是一个框架,直白点讲就是提高效率的工具,好比工厂干活,以前是人机械式的工作,现在用上了机器,人只用去操作机器就行了。那么spring工具提供了一个大容器,每次工作前把需要的东西全放进去,用的时候去容器拿,不用像之前用的时候还要跑回去拿。框架终究只是一个工具,如果如何使用都不熟练,什么工具都不好上手,所以最重要的是基础。 大多数的框架都是一种套路,利用资源加载和反射,不断的加载配置文件,比如factories,handlers等等,value值往往就是对应 阅读详情

相关推荐

CHI里的Error handling机制

本文讲解了CHI里的Error handling机制。

W1Z1Q的专栏 2498

spring上下文刷新做了些什么事情

public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRe...

李承 623

【本体】Protege高效批量导入实例(Individuals)的自动化实践

本文详细介绍了在Protege中高效批量导入实例(Individuals)的自动化实践方法。通过分析Protege本体文件结构,提供Python脚本示例,帮助用户快速处理大规模数据导入,显著提升知识图谱构建效率。特别适合需要处理数千个实例的医疗、制药等领域应用。

weixin_30275415的博客 408

Spring源码深度解析:三、容器的刷新 - refresh()

实例化并调用所有注册的BeanFactoryPostProcessor Bean,并遵循显式顺序(如果给定的话)。必须在单例实例化之前调用。BeanFactory 作为Spring中容器功能的基础,用于存放所有已经加载的bean,为了保证程序的可扩展性,Spring针对BeanFactory做了大量的扩展,如PostProcessor。这一步的功能主要是激活各种。

知行 1958

华为OD机试真题 Java&Go 实现【优雅子数组】【100%通过率】【2022.11 Q4 新题】

如果一个数组中出现次数最多的元素出现大于等于K次,被称为K -优雅数组,k也可以被称为优雅阈值。例如,数组1,2,3,1、2,3,1,它是一个3-优雅数组,因为元素1出现次数大于等于3次,数组1,2,3,1,2就不是一个3-优雅数组,因为其中出现次数最多的元素是1和2,只出现了2次。给定一个数组A和k,请求出A有多少子数组是k-优雅子数组。

MISAYAONE的博客 1万+

DO-254标准详解:航空电子硬件设计保证指南全方位解析

RTCA DO-254, 也被称为《机载电子硬件设计保证指南》,是航空电子硬件设计和验证中的关键标准,旨在为确保机载电子硬件的安全性提供设计保证。自2000年首次发布以来,DO-254就成为了民航和军用飞机中电子硬件设计认证的基准文件。随着航空硬件技术的进步和日益复杂化,确保硬件设计的准确性、可靠性和安全性变得至关重要。本标准是由RTCA和EUROCAE共同开发的,适用于涉及机载硬件的航空公司、飞机制造商、供应商和认证机构。

qq_41854911的博客 3682

Spring Boot 启动过程深度解析

本文主要是为了解决大家阅读springboot时候的痛点,虽然大家看过代码,但可能被代码的复杂性和细节淹没了,没能抓住主线。因为Spring Boot 的启动流程本身是一个多步骤、涉及多个关键组件的过程,如果没有一个清晰的框架,确实容易迷失方向。所以,我回从整体到局部,逐步深入,把每一步的逻辑讲清楚,同时不忽视代码中的关键点,比如那些看似不起眼但却至关重要的设计。

aoxin002的博客 1570

基于jeecgboot3.9.0的项目管理——项目工作台(二)

基于jeecgboot3.9.0的项目管理——项目工作台(二)

宁波阿成的博客 204

聚焦IOC容器刷新环节obtainFreshBeanFactory初始化BeanFactory专项

探讨BeanFactory的刷新机制,从最基本的IOC容器刷新环节出发,逐步分析了其具体实现。主要介绍BeanFactory的刷新过程,然后通过源码分析了在注解驱动和XML配置方式下如何创建和初始化BeanFactory。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 8万+

RT-DETR改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度

本文记录的是利用改进检测精度,详细说明了优化原因,注意事项等。原论文在红外小目标检测任务中,小目标在多次下采样操作中容易丢失关键信息。通过替代编码器和解码器基本组件中的传统卷积操作,更好地保留小目标的重要信息。HCF-Net: Hierarchical Context Fusion Network for Infrared Small Object Detection采用多分支特征提取策略,通过不同分支提取不同尺度和层次的特征。利用局部、全局和串行卷积分支,对输入特征张量进行处理。通过控制 patch si

Limiiiing的博客 1646

16、天文时间序列分类:基于人工神经网络的研究

本研究探讨了基于人工神经网络的天文时间序列分类方法,重点比较了MLP、LSTM和CNN等模型在BRITE和开普勒K2数据集上的表现。研究发现LSTM不适用于此类数据,而结合特征提取与PSO超参数优化的多层感知器(MLP)在开普勒K2数据上实现了98.55%的二分类准确率。通过精细的数据预处理和高置信度样本选择,显著提升了分类性能。研究成果为恒星变异性识别提供了高效工具,并对天文学与机器学习交叉领域具有重要参考价值。

pz8901234的博客 111

剖析Spring源码:加载IOC容器

本文接上一篇文章阅读Spring源码:IOC控制反转前的处理,继续进行下面的分析 首先贴出 Spring bean容器的刷新的核心 11个步骤进行祭拜(一定要让我学会了…阿门) //完成IoC容器的创建及初始化工作 @Override publicvoidrefresh()throwsBeansException,IllegalStateException{ synchr...

Java笔记虾 1761

YOLOv11改进 | 引入SFSConv空间频率选择卷积(含SFSC3k2二次创新),空间频率特征协同作用,检测性能全面提升

本文提出在YOLOv11中引入SFSConv空间频率选择卷积模块,通过显式分离和动态融合空间域与频率域特征,解决传统卷积对多尺度目标检测的局限性。SFSConv包含空间频率分离、动态权重融合和协同特征重建三个核心机制,并进一步创新提出SFSC3k2结构,通过双路频率分支增强特征协同作用。该改进显著提升了YOLOv11在遥感、医学等多尺度复杂场景下的检测性能,实验显示在微小目标检测任务中mAP提升5%-10%。代码实现展示了SFSConv模块的核心逻辑及其在PyTorch中的高效实现。

走向CTO的路上... 767

Spring IOC源码分析之-刷新前的准备工作

目录 ClassPathXmlApplicationContext的注册方式 加载父子容器 配置路径解析 容器刷新 刷新容器之刷新预处理 ClassPathXmlApplicationContext的注册方式 源码分析基于Spring4.3 从ClassPathXmlApplicationContext入口,最终都会调用到 /* *...

编程知识分享 149

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spring源码分析

Spring源码分析

qq_32003693的博客 1129

老版QQ原生表情gif动态

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

6.IOC容器源码解读—核心流程原理

​ 这个方法用来加载刷新配置,这些配置可能来自,java配置、xml文件、properties文件,关系型数据库,或者其他格式。​ 作为一个启动方法,它应当在初始化失败后销毁已经创建了的单例,防止占着资源不用。也就是说调用这个方法,要么没有所有的单例被创建、要么没有没有单例对象创建。/**whichfile, a* 这个方法用来加载刷新配置,这些配置可能来自,java配置、xml文件、properties文件,关系型数据库,或者其他格式。

RubyWinner的博客 1074

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

聚焦IOC容器刷新环节obtainFreshBeanFactory初始化BeanFactory专项10

在这个过程中,旧的 BeanFactory 实例将被销毁,新的 BeanFactory 实例将被创建和初始化,确保了每次获取 BeanFactory 时都可以获取到最新的实例,从而保持应用程序的状态和配置的一致性。返回 BeanFactory:最后,方法将获取到的 BeanFactory 实例返回给调用者,以便它可以在应用程序中使用,BeanFactory 是整个 Spring 应用程序的核心,它负责管理应用程序中的所有 Bean 实例。@Bean:声明一个Bean,由Spring容器管。

2401_89357748的博客 788

聚焦IOC容器刷新环节obtainFreshBeanFactory初始化BeanFactory专项3

在这个过程中,旧的 BeanFactory 实例将被销毁,新的 BeanFactory 实例将被创建和初始化,确保了每次获取 BeanFactory 时都可以获取到最新的实例,从而保持应用程序的状态和配置的一致性。返回 BeanFactory:最后,方法将获取到的 BeanFactory 实例返回给调用者,以便它可以在应用程序中使用,BeanFactory 是整个 Spring 应用程序的核心,它负责管理应用程序中的所有 Bean 实例。@Bean:声明一个Bean,由Spring容器管。

2401_89357748的博客 878

Spring ApplicationContext 高级容器源码解析

这里我们来看一下这个beanDefinition是怎么加载到BeanFactory里面的。//加载所有的bean定义配置进入loadBeanDefinitions()方法。@Override//1. 将beanFactory传进去创建一个xml的bean定义读取器,负责读取xml中的bean定义//2. 设置当前的环境信息到读取器里//3. 将当前这个资源加载器,也就是ApplicationContext设置进去//4. 设置实体解析器,将xml最终解析为一些实体。

MaginaD的博客 1234

聚焦IOC容器刷新环节obtainFreshBeanFactory初始化BeanFactory专项11

在这个过程中,旧的 BeanFactory 实例将被销毁,新的 BeanFactory 实例将被创建和初始化,确保了每次获取 BeanFactory 时都可以获取到最新的实例,从而保持应用程序的状态和配置的一致性。返回 BeanFactory:最后,方法将获取到的 BeanFactory 实例返回给调用者,以便它可以在应用程序中使用,BeanFactory 是整个 Spring 应用程序的核心,它负责管理应用程序中的所有 Bean 实例。@Bean:声明一个Bean,由Spring容器管。

2401_89357748的博客 930

Spring源码解析之容器的创建与XML配置的读取

在前面我们介绍过Spring将资源抽象为Resource,并且提供了不同的实现处理不同类型的资源,比如File、Http、Ftp、classpath等等,本篇我们讲述Spring容器的创建与资源的加载,对于Spring容器,我们说XmlBeanFactory或者ApplicationContext都可以是Spring容器,都可以从其中获取到Bean,但是其核心类为DefaultListableBeanFactory,创建IOC容器的过程也就是创建DefaultListableBeanFactory实例的过程

微服务技术栈 378

聚焦IOC容器刷新环节obtainFreshBeanFactory初始化BeanFactory专项5

在这个过程中,旧的 BeanFactory 实例将被销毁,新的 BeanFactory 实例将被创建和初始化,确保了每次获取 BeanFactory 时都可以获取到最新的实例,从而保持应用程序的状态和配置的一致性。返回 BeanFactory:最后,方法将获取到的 BeanFactory 实例返回给调用者,以便它可以在应用程序中使用,BeanFactory 是整个 Spring 应用程序的核心,它负责管理应用程序中的所有 Bean 实例。@Bean:声明一个Bean,由Spring容器管。

2401_89357748的博客 947

聚焦IOC容器刷新环节obtainFreshBeanFactory初始化BeanFactory专项9

在这个过程中,旧的 BeanFactory 实例将被销毁,新的 BeanFactory 实例将被创建和初始化,确保了每次获取 BeanFactory 时都可以获取到最新的实例,从而保持应用程序的状态和配置的一致性。返回 BeanFactory:最后,方法将获取到的 BeanFactory 实例返回给调用者,以便它可以在应用程序中使用,BeanFactory 是整个 Spring 应用程序的核心,它负责管理应用程序中的所有 Bean 实例。@Bean:声明一个Bean,由Spring容器管。

2401_89357748的博客 791
上一篇: MQ如何保证分布式事务
下一篇: spring源码加载bean定义信息 loadBeanDefinitions
奔跑的蜗牛...
博客等级 码龄6年 344粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值