Spring 源码----XML 文件解析流程

本文深入探讨Spring中XML配置文件的解析流程,从XmlBeanDefinitionReader开始,讲解其继承关系、关键类如BeanDefinitionDocumentReader和DocumentLoader的作用,以及如何通过ResourceLoader、Document对象完成BeanDefinition的创建。通过一个简单案例,逐步分析XmlBeanFactory构造方法中的loadBeanDefinitions过程,解析到Document对象。文章总结了获取Document对象的关键步骤,并提供了相关学习资源。
摘要由CSDN通过智能技术生成

1、XmlBeanDefinitionReader

XmlBeanFactory 中加载 XML 文件流的对象是 XmlBeanDefinitionReader,因此关于 XML 的解析我们就从 XmlBeanDefinitionReader 开始讲起。

先来看一张 XmlBeanDefinitionReader 的继承关系图:
在这里插入图片描述
这张继承关系图中涉及到了几个接口,我这里和大家说一下:

  1. BeanDefinitionReader:这个接口主要定义了资源文件的读取并将资源转为 BeanDefinition。
  2. EnvironmentCapable:这个接口定义了获取 Environment 的方法。
  3. AbstractBeanDefinitionReader:实现了 BeanDefinitionReader 和
    EnvironmentCapable 接口中所定义的方法。同时,AbstractBeanDefinitionReader
    中多了一个比较关键的属性叫做 ResourceLoader,ResourceLoader 可以根据给定的资源返回对应的Resource。
  4. XmlBeanDefinitionReader 则在 AbstractBeanDefinitionReader 的基础上继续扩展了它的功能。

这是 XmlBeanDefinitionReader 的继承关系。

打开 XmlBeanDefinitionReader 的源码,我们发现还有两个关键的对象:

  1. BeanDefinitionDocumentReader:BeanDefinitionDocumentReader接口只有一个实现类就是 DefaultBeanDefinitionDocumentReader ,在这里定义了对 Document对象的读取并将读取到的属性转为 BeanDefinition。
  2. DocumentLoader:将资源文件转为 Document 对象。

担心有的小伙伴可能不知道 Document 是啥,我这里再稍微说两句。Document 就是 XML解析时获取到的文档对象,Document 对象代表了一个 XML 文档的模型树,所有的其他 Node 都以一定的顺序包含在 Document 对象之内,排列成一个树状结构,以后对 XML 文档的所有操作都与解析器无关,直接在这个 Document 对象上进行操作即可。主流的 XML 解析方式有 SAX 解析、DOM 解析以及 Pull 解析。如果大家对于 XML 文件解析不熟悉的话,可以自行复习。

好了,了解了 XmlBeanDefinitionReader 的继承关系以及里边定义的两个关键类之后,我们来大概梳理一下 XmlBeanDefinitionReader 的功能:

  1. 首先 XmlBeanDefinitionReader 继承自 AbstractBeanDefinitionReader,利用
    AbstractBeanDefinitionReader 中的 ResourceLoader 将配置文件路径转为对应的
    Resource。
  2. 接下来,利用 DocumentLoader 将 Resource 转为 Document。
  3. 最后,利用 BeanDefinitionDocumentReader 去解析 Document。

把这些先搞清楚之后,接下来我们来走流程。

2、走流程

一个简单案例:

public static void main(String[] args) {
   
    XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
    User user = factory.getBean(User.class);
    System.out.println("user = " + user);
}

我们就跟着 XmlBeanFactory 的构造方法来走一遍。

先来看 XmlBeanFactory 的构造方法:

public class XmlBeanFactory extends DefaultListableBeanFactory {
   
	private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
	public XmlBeanFactory(Resource resource) throws BeansException {
   
		this(resource, null);
	}
	public XmlBeanFactory(Resource resource
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值