概述

在这一篇,我们开始分析 Spring 的源码。但是在正式开始熟悉源码之前,有必要了解一下 Spring 中最核心的两个类。

DefaultListableBeanFactory

XmlBeanFactory 继承自 DefaultListableBeanFactory,而 DefaultListableBeanFactory 是整个 bean 加载的核心部分,是 Spring 注册及加载 bean 的默认实现,而对于 XmlBeanFactory 与 DefaultListableBeanFactory 不同的地方其实是在 XmlBeanFactory 中使用了自定义的XML读取器 XmlBeanDefinitionReader,实现了个性化的BeanDefinitionReader 读取,DefaultListableBeanFactory 继承了 AbstractAutowireCapableBeanFactory 并实现了ConfigurableListableBeanFactory 以及 BeanDefinitionRegistry 接口。以下是 DefaultListableBeanFactory 的类图:
image.png

从上面的类图中,我们可以清晰地从全局角度了解 DefaultListableBeanFactory 的脉络。接下来先了解一下上面类图中各个类的作用。

接口或类 说明
AliasRegistry 定义对alias的简单增删改查等操作
SimpleAliasRegistry 主要使用map作为alias的缓存,并对接口AliasRegistry进行实现
SingletonBeanRegistry 定义对单例的注册及获取
BeanFactory 定义获取bean及bean的各种属性
DefaultSingletonBeanFactory 对接口SingletonBeanRegistry各函数的实现
HierarchicalBeanFactory 继承BeanFactory,也就是在BeanFactory定义的功能的基础上增加了对parentFactory的支持
BeanDefinitionRegistry 定义对BeanDefinition的各种增删改操作
FactoryBeanRegistrySupport 在DefaultSingletonBeanRegistry的基础上增加了对FactoryBean的特殊处理功能
ConfigurableBeanFactory 提供配置Factory的各种方法
ListableBeanFactory 根据各种条件获取bean的配置清单
AbstractBeanFactory 综合FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能
AutowireCapableBeanFactory 提供创建bean、自动注入,初始化以及应用bean的后处理器
AbstractAutowireCapableBeanFactory 综合AbstractBeanFactory并对接口AutowireCapableBeanFactory进行实现
ConfigurableListableBeanFactory BeanFactory配置清单,指定忽略类型及接口等
DefaultListableBeanFactory 综合上面所有功能,主要是对Bean注册后的处理

XmlBeanFactory 对 DefaultListableBeanFactory 进行了扩展,主要用于从 XML 文档中读取 BeanDefinition,对于注册及获取 Bean 都是使用从父类 DefaultListableBeanFactory 继承的方法去实现,而唯独与父类不同的个性化实现就是增加了 XmlBeanDefinitionReader 类型的 reader 属性。在 XmlBeanFactory 中主要使用 reader 属性对资源文件进行读取和注册。

XmlBeanDefinitionReader

XML 配置文件的读取时 Spring 的重要功能,因为 Spring 的大部分功能都是以配置作为切入点的,那么我们可以从 XmlBeanDefinitionReader 中梳理一下资源文件读取、解析及注册的大致脉络。首先我们看看各个类的功能。

ResourceLoader 定义资源加载器,主要应用于根据给定的资源文件地址返回对应的Resource
BeanDefinitionReader 主要定义资源文件读取并转换为BeanDefinition的各个功能
EnvironmentCapable 定义获取Environment方法
DocumentLoader 定义从资源文件加载到转换为Document的功能
AbstractBeanDefinitionReader 对EnvironmentCapable、BeanDefinitionReader类定义的功能进行实现
BeanDefinitionDocumentReader 定义读取Document并注册BeanDefiniton功能
BeanDefinitionParserDelegate 定义解析Element的各种方法

通过以上分析,我们可以梳理出整个XML配置文件读取的大致流程,如下图所示:
963903-20180726234047297-928369586-1.png

在 XmlBeanDifinitonReader 中主要包含以下几个步骤的处理:

  1. 通过继承自 AbstractBeanDefinitionReader 中的方法 ,来使用 ResourceLoader 将资源文件路径转换为对应的Resource文件。
  2. 通过 DocumentLoader 对 Resource 文件进行转换,将 Resource 文件转换为 Document 文件。
  3. 通过实现接口 BeanDefinitionDocumentReader 的 DefaultBeanDefinitionDocumentReader 类对 Document 进行解析,并使用 BeanDefinitionParserDelegate 对 Element 进行解析。