Spring是如何加载Xml文件的
这是一个很有意思的话题,在我刚学习spring框架的时候是使用Junit测试配置的DataSource是否配置成功,那时候要写一段这样的代码来加载我们配置好的XML文件:
@Test
public void loadXML(){
ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
factory.getBean("DataSource");
}
当然我们现在很少使用这种方式手动去加载一个XML文件了,现在大部分的Spring项目大部分是使用SpringBoot了,减少了不少之前springMVC项目中各种繁杂的配置项,以后就是springBoot的天下了,当然这个另作一说了;
最近看了一些spring底层运行的书,对着一块也是有了更深入的了解,spring是如何加载properties文件和XML文件的;
核心实现代码
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的方法
还有一种方式是读取当前文档自己自带的结构格式规范,来解析XML文件,感兴趣的话可以自己下去查询一下;
2.XmlBeanDefinitionReader类
加载过程:
1.使用ResourceLoader将资源文件加载到对应的Resource
2.通过DocumentLoader对文件进行转换,将resource文件转换成document
3.通过实现的接口对Document进行解析,使用BeanDefinitionParserDelegate对Element进行解析
这是我在网上找的的XmlBeanFactory运行的时序图:
联系我们一开始写的那段代码,我们首先是调用了ClassPathResource的构造函数来构造Resouce文件的实例化,然后拿到Resuorce之后就可以进行XmlBeanFactory的初始化了;