Spring 的在实际开发过程中都是以XML 配置文件+注解的形式进行使用,那么XML配置文件的读取是Spring中重要的功能,

在Spring中,加载XML配置文件的语句如下:

java xml增加 spring context spring加载xml配置_mybatis


使用ClassPathXmlApplicationContext类的构造函数加载XML配置文件,代码如下:

java xml增加 spring context spring加载xml配置_mybatis_02


ClassPathXmlApplicationContext()方法调用的是继承类的setConfigLocations()方法初始化配置文件XML的位置.代码如下:

java xml增加 spring context spring加载xml配置_java_03

java xml增加 spring context spring加载xml配置_java_04


AbstractRefreshableConfigApplicationContext.setConfigLocations()方法对XML配置文件路径进行了设置并放到全局变量String数组中保存.在对XML配置文件加载完成后,会进行调用AbstractApplicationContext.refresh()方法加载或刷新持久化的配置信息.代码如下:

java xml增加 spring context spring加载xml配置_xml_05


从代码中可以看到,方法调用obtainFreshBeanFactory() 告诉子类刷新内部bean工厂, 此方法主要实现三件事,第一:创建beanFactory共产, 第二: 解析xml文件生成beanDefinition对象, 第三:注册到beanDefinitionRegistry中,obtainFreshBeanFactory()代码如下:

java xml增加 spring context spring加载xml配置_加载_06

obtainFreshBeanFactory()中调用AbstractRefreshableApplicationContext.refreshBeanFactory()方法实现上下文底层bean工厂的刷新,如果有旧的bean工厂则关闭,并为上下文阶段初始新的bean工厂,具体代码如下:

java xml增加 spring context spring加载xml配置_xml_07

refreshBeanFactory()方法调用了AbstractXmlApplicationContext.loadBeanDefinitions()方法加载bean定义,具体代码如下:

java xml增加 spring context spring加载xml配置_java_08


loadBeanDefinitions()方法调用loadBeanDefinitions()方法用于加载或注册bean definitions,具体代码如下

java xml增加 spring context spring加载xml配置_XML_09


对多个XML文件进行循环解析,调用loadBeanDefinitions()方法进行解析:

java xml增加 spring context spring加载xml配置_mybatis_10


loadBeanDefinitions()方法调用重载的方法从自定位置加载BeanDefinition,前提是这个bean定义读取器的ResourceLoader是一个ResourcePatternResolver。具体代码如下:

java xml增加 spring context spring加载xml配置_xml_11


java xml增加 spring context spring加载xml配置_加载_12


java xml增加 spring context spring加载xml配置_加载_13


loadBeanDefinitions()方法调用了XmlBeanDefinitionReader.loadBeanDefinitions() 从特定的XML配置文件加载bean definitions.具体代码如下:

java xml增加 spring context spring加载xml配置_java_14


重载loadBeanDefinitions()方法

java xml增加 spring context spring加载xml配置_xml_15


java xml增加 spring context spring加载xml配置_mybatis_16


解析为document对象,之后就要注册beanDefinition了,在spring的加载过程中,BeanDefinition是一个重要的数据结构,它是在创建对象之前,对象数据的一种存在形式

xml —— beanDefinition ——bean 从xml配置bean ,到解析xml创建 beanDefinition , 到从beanDefinition实例为 bean对象,这是一个流程。

docoment对象的解析过程委托给了BeanDefinitionDocumentReader对象来完成:

java xml增加 spring context spring加载xml配置_java_17


DefaultBeanDefinitionDocumentReader.registerBeanDefinitions()方法

java xml增加 spring context spring加载xml配置_java_18


委托给document的解析器,入参为document的根元素,就是spring-context.xml的beans元素:

java xml增加 spring context spring加载xml配置_XML_19


java xml增加 spring context spring加载xml配置_mybatis_20


到此为止,XML配置文件就加载完成了,