松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程
Spring 源码继续开整!
上篇文章中,松哥和大家分享了 Spring 中配置文件的加载方式,如果小伙伴们还没看过,一定先看一下,这有助于更好的理解本文,传送门:Spring 源码第一篇开整!配置文件是怎么加载的?。
上篇文章和大家分享了 Spring 中是如何加载本地配置文件的,如何将加载到的本地配置文件通过一个 InputStream 返回。了解到这一点之后,接下来就是对 InputStream 的解析了。
本文我们就来看一下整个解析流程是什么样子的。
1.XmlBeanDefinitionReader
在上篇文章中,小伙伴们可以看到,XmlBeanFactory 中加载 XML 文件流的对象是 XmlBeanDefinitionReader,因此关于 XML 的解析我们就从 XmlBeanDefinitionReader 开始讲起。
先来看一张 XmlBeanDefinitionReader 的继承关系图:

这张继承关系图中涉及到了几个接口,我这里和大家说一下:
- BeanDefinitionReader:这个接口主要定义了资源文件的读取并将资源转为 BeanDefinition。
- EnvironmentCapable:这个接口定义了获取 Environment 的方法。
- AbstractBeanDefinitionReader:实现了 BeanDefinitionReader 和 EnvironmentCapable 接口中所定义的方法。同时,AbstractBeanDefinitionReader 中多了一个比较关键的属性叫做 ResourceLoader,ResourceLoader 可以根据给定的资源返回对应的 Resource。
- XmlBeanDefinitionReader 则在 AbstractBeanDefinitionReader 的基础上继续扩展了它的功能。
这是 XmlBeanDefinitionReader 的继承关系。
打开 XmlBeanDefinitionReader 的源码,我们发现还有两个关键的对象:
- BeanDefinitionDocumentReader:BeanDefinitionDocumentReader 接口只有一个实现类就是 DefaultBeanDefinitionDocumentReader ,在这里定义了对 Document 对象的读取并将读取到的属性转为 BeanDefinition。
- DocumentLoader:将资源文件转为 Document 对象。
❝担心有的小伙伴可能不知道 Document 是啥,我这里再稍微说两句。Document 就是 XML 解析时获取到的文档对象,Document