Spring源码解析1-spring启动(解析配置,注入容器)

本文深入解析Spring框架的初始化过程,重点在于配置文件的定位、解析及如何将BeanDefinition注入到IOC容器中。从setConfigLocations()开始,通过Environment解析占位符,然后在refresh()方法中,依次进行prepareRefresh()、beanFactory的创建与初始化,最后通过BeanDefinitionParserDelegate解析bean定义并注册到容器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring的ioc容器初始化细节

定位配置文件,解析配置文件成beandefinition,注入ioc容器
在这里插入图片描述
配置文件构造方法
在这里插入图片描述

setConfigLocations(),设置应用程序上下文的配置路径,资源文件的路径
在这里插入图片描述

getEnvironment()获取环境变量
在这里插入图片描述

createEnvironment()
在这里插入图片描述

StandardEnvironment(),创建标准环境
在这里插入图片描述

这个StandardEnvironment类是没有构造函数,默认是无参构造,调用父类AbstractEnvironment的无参构造
在这里插入图片描述

AbstractEnvironment,自定义属性源,可以拓展想要定义的属性
在这里插入图片描述

最终调回StandardEnvironment的customizePropertySources()方法
在这里插入图片描述

resolveRequiredPlaceholders(path),解析所需的占位符,匹配一些${ }的占位符
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

doResolvePlaceholders的parseStringValue() 将配置文件中的占位符进行值的替换处理
在这里插入图片描述

替换完资源文件路径的占位符,容器开始初始化
refresh()
一.prepareRefresh()方法
前戏,做容器刷新前的准备工作
1、设置容器的启动时间
2、设置活跃状态为true
3、设置关闭状态为false
4、获取Environment对象,并加载当前系统的属性值到Environment对象中
5、准备监听器和事件的集合对象,默认为空的集合
在这里插入图片描述

initPropertySources(),留给子类实现,初始化属性资源

在这里插入图片描述

初始化属性拓展,自定义属性值,环境变量进行替换
在这里插入图片描述

二、ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
创建容器对象:DefaultListableBeanFactory,当前有容器销毁再创建新容器,加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition
在这里插入图片描述

refreshBeanFactory() 初始化BeanFactory,设置BeanFactory的属性,并进行XML文件读取,并将得到的BeanFactory记录在当前实体的属性中.
getBeanFactory() 返回当前实体的beanFactory属性
在这里插入图片描述

createBeanFactory(),创建DefaultListableBeanFactory对象
customizeBeanFactory(beanFactory);定制化beanFactory,设置相关属性,包括是否允许覆盖同名称的不同定义的对象以及循环依赖
在这里插入图片描述

loadBeanDefinitions() 初始化documentReader,设置环境变量,资源解析器,并进行XML文件读取及解析,默认命名空间的解析,自定义标签的解析
在这里插入图片描述

开始beanDefinition的加载
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

将资源文件 从String[]-string-Resource[]- resource,最终开始将resource读取成一个document文档,根据文档的节点信息封装成一个个的BeanDefinition对象
在这里插入图片描述

registerBeanDefinitions()根据文档的节点信息封装成一个个的BeanDefinition对象
在这里插入图片描述
在这里插入图片描述

创建BeanDefinitionParserDelegate解析器来解析封装成beandefinition
在这里插入图片描述
在这里插入图片描述

默认命名空间标签,import,alias,bean,beans
在这里插入图片描述

解析bean标签的处理
在这里插入图片描述

parseBeanDefinitionElement()
解析bean元素,得到BeanDefinitionHolder,beanDefinitionHolder是beanDefinition对象的封装类,封装了BeanDefinition,bean的名字和别名,用它来完成向IOC容器的注册,得到的beanDefinitionHolder说明意味beandefinition是通过BeanDefinitionParserDelegate对xml元素的信息按照spring的bean规则进行
在这里插入图片描述

parseBeanDefinitionElement() ,对bean元素详细解析
在这里插入图片描述

解析完获得一个完整的BeanDefinitionHolder,包含beanDefinition、beanName,别名数组
在这里插入图片描述

对解析获得BeanDefinitionHolder进行装饰,如果适用,通过名称空间的handler修饰给bean定义信息
在这里插入图片描述

registerBeanDefinition(),向ioc容器注册解析得到的beandefinition
在这里插入图片描述
在这里插入图片描述

registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition()); 解析的beanDefinition注册到ioc容器
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值