Spring是如何加载Xml文件的

Spring是如何加载Xml文件的

这是一个颇有意思的话题,在我刚学习spring框架的时候是使用Junit测试配置的DataSource是否配置成功,那时候要写一段这样的代码来加载咱们配置好的XML文件:web

@Test
public void loadXML(){

    ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    factory.getBean("DataSource");

}

固然咱们如今不多使用这种方式手动去加载一个XML文件了,如今大部分的Spring项目大部分是使用SpringBoot了,减小了很多以前springMVC项目中各类繁杂的配置项,之后就是springBoot的天下了,固然这个另做一说了;spring

最近看了一些spring底层运行的书,对着一块也是有了更深刻的了解,spring是如何加载properties文件和XML文件的;app

核心实现代码

1.DefaultListableBeanFactory类

package org.springframework.beans.factory.support;下的
DefaultListableBeanFactory类是这是Spring注册及加载的核心部分,是spring注册及加载bean的默认的实现,而XmlBeanFactory是继承自DefaultListableBeanFactory他们的区别是XmlBeanFactory中有一个本身定义的xml读取器(using an XmlBeanDefinitionReader),而这个读取的方式是根据XML Document方式来实现的;

固然这就涉及到XML解析的两个方式:一种就是当前说到的这种XML Doucument的方式,解析的过程当中是经过读取XML Doucument 这至关于XML文档的约定格式的规范;框架


上面的方法就是XmlBeanDefinitionReader中加载document的方法svg

还有一种方式是读取当前文档本身自带的结构格式规范,来解析XML文件,感兴趣的话能够本身下去查询一下;函数

2.XmlBeanDefinitionReader类

加载过程:学习

1.使用ResourceLoader将资源文件加载到对应的Resource
测试

2.经过DocumentLoader对文件进行转换,将resource文件转换成document
spa

3.经过实现的接口对Document进行解析,使用BeanDefinitionParserDelegate对Element进行解析code

这是我在网上找的的XmlBeanFactory运行的时序图:

联系咱们一开始写的那段代码,咱们首先是调用了ClassPathResource的构造函数来构造Resouce文件的实例化,而后拿到Resuorce以后就能够进行XmlBeanFactory的初始化了;