文章插图
上面类图中各个类及接口的作用如下:
- AliasRegistry:定义对alias的简单增删改等操作
- SimpleAliasRegistry:主要使用map作为alias的缓存 , 并对接口AliasRegistry进行实现
- SingletonBeanRegistry:定义对单例的注册及获取
- BeanFactory:定义获取bean及bean的各种属性
- DefaultSingletonBeanRegistry:默认对接口SingletonBeanRegistry各函数的实现
- HierarchicalBeanFactory:继承BeanFactory , 也就是在BeanFactory定义的功能的基础上增加了对parentFactory的支持
- BeanDefinitionRegistry:定义对BeanDefinition的各种增删改操作
- FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能
- ConfigurableBeanFactory:提供配置Factory的各种方法
- ListableBeanFactory:根据各种条件获取bean的配置清单
- AbstractBeanFactory:综合FactoryBeanRegistrySupport和ConfigurationBeanFactory的功能
- AutowireCapableBeanFactory:提供创建bean、自动注入、初始化以及应用bean的后处理器
- AbstractAutowireCapableBeanFactory:综合AbstractBeanFactory并对接口AutowireCapableBeanFactory进行实现
- ConfigurableListableBeanFactory:BeanFactory配置清单 , 指定忽略类型及接口等
- DefaultListableBeanFactory:综合上面所有功能 , 主要是对Bean注册后的处理
XmlBeanFactory对DefaultListableBeanFactory类进行了扩展 , 主要用于从XML文档中读取BeanDefinition , 对于注册及获取Bean都是使用从父类DefaultListableBeanFactory继承的方法去实现 , 而唯独与父类不同的个性化实现就是增加了XmlBeanDefinitionReader类型的reader属性 。在XmlBeanFactory中主要使用reader属性对资源文件进行读取和注册
4.2.2 XmlBeanDefinitionReader
XML配置文件的读取是Spring中重要的功能 , 因为Spring的大部分功能都是以配置作为切入点的 , 可以从XmlBeanDefinitionReader中梳理一下资源文件读取、解析及注册的大致脉络 , 先看看各个类的功能
ResourceLoader:定义资源加载器 , 主要应用于根据给定的资源文件地址返回对应的Resource
BeanDefinitionReader:主要定义资源文件读取并转换为BeanDefinition的各个功能
EnvironmentCapable:定义获取Environment方法
DocumentLoader:定义从资源文件加载到转换为Document的功能
AbstractBeanDefinitionReader:对EnvironmentCapable、BeanDefinitionReader类定义功能进行实现
BeanDefinitionDocumentReader:定义读取Document并注册BeanDefinition功能
BeanDefinitionParserDelegate:定义解析Element的各种方法
整个XML配置文件读取的大致流程 , 在XmlBeanDefinitionReader中主要包含以下几步处理
文章插图
(1)通过继承自AbstractBeanDefinitionReader中的方法 , 来使用ResourceLoader将资源文件路径转换为对应的Resource文件
(2)通过DocumentLoader对Resource文件进行转换 , 将Resource文件转换为Document文件
(3)通过实现接口BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader类对Document进行解析 , 并使用BeanDefinitionParserDelegate对Element进行解析
5. 容器的基础XmlBeanFactory通过上面的内容我们对spring的容器已经有了大致的了解 , 接下来我们详细探索每个步骤的详细实现 , 接下来要分析的功能都是基于如下代码:
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-bean.xml"));通过XmlBeanFactory初始化时序图看一看上面代码的执行逻辑 , 如下图所示:
文章插图
时序图从TestDemo测试类开始 , 首先调用ClassPathResource的构造函数来构造Resource资源文件的实例对象 , 这样后续的资源处理就可以用Resource提供的各种服务来操作了 。有了Resource后就可以对BeanFactory进行初始化操作 , 那配置文件是如何封装的呢?
5.1 配置文件的封装
Spring的配置文件读取是通过ClassPathResource进行封装的 , Spring对其内部使用到的资源实现了自己的抽象结构:Resource接口来封装底层资源 , 如下源码:
推荐阅读
- SpringBoot传输Long类型精度损失
- SpringMVC访问出错No converter found for return value of type
- 深度心理学,理解和超越自卑
- 赤霞珠、梅洛、黑皮诺、西拉......深度解读7大红葡萄品种
- 安卓|三星神速!基于Android 13深度定制的One UI 5.0已在路上
- 鲸鱼可以下潜10000米深吗 鲸鱼一般在海底多少米的深度
- 李沧区,促品牌化发展 深度培育放心茶 品牌茶
- 李剑叶:“飞扬”的设计将现代与传统深度融合
- Spring框架和Spring Boot框架的区别
- 茶 旅深度结合 黄山旅游品牌锦上添花