Spring 的在实际开发过程中都是以XML 配置文件+注解的形式进行使用,那么XML配置文件的读取是Spring中重要的功能,
在Spring中,加载XML配置文件的语句如下:
使用ClassPathXmlApplicationContext类的构造函数加载XML配置文件,代码如下:
ClassPathXmlApplicationContext()方法调用的是继承类的setConfigLocations()方法初始化配置文件XML的位置.代码如下:
AbstractRefreshableConfigApplicationContext.setConfigLocations()方法对XML配置文件路径进行了设置并放到全局变量String数组中保存.在对XML配置文件加载完成后,会进行调用AbstractApplicationContext.refresh()方法加载或刷新持久化的配置信息.代码如下:
从代码中可以看到,方法调用obtainFreshBeanFactory() 告诉子类刷新内部bean工厂, 此方法主要实现三件事,第一:创建beanFactory共产, 第二: 解析xml文件生成beanDefinition对象, 第三:注册到beanDefinitionRegistry中,obtainFreshBeanFactory()代码如下:
obtainFreshBeanFactory()中调用AbstractRefreshableApplicationContext.refreshBeanFactory()方法实现上下文底层bean工厂的刷新,如果有旧的bean工厂则关闭,并为上下文阶段初始新的bean工厂,具体代码如下:
refreshBeanFactory()方法调用了AbstractXmlApplicationContext.loadBeanDefinitions()方法加载bean定义,具体代码如下:
loadBeanDefinitions()方法调用loadBeanDefinitions()方法用于加载或注册bean definitions,具体代码如下
对多个XML文件进行循环解析,调用loadBeanDefinitions()方法进行解析:
loadBeanDefinitions()方法调用重载的方法从自定位置加载BeanDefinition,前提是这个bean定义读取器的ResourceLoader是一个ResourcePatternResolver。具体代码如下:
loadBeanDefinitions()方法调用了XmlBeanDefinitionReader.loadBeanDefinitions() 从特定的XML配置文件加载bean definitions.具体代码如下:
重载loadBeanDefinitions()方法
解析为document对象,之后就要注册beanDefinition了,在spring的加载过程中,BeanDefinition是一个重要的数据结构,它是在创建对象之前,对象数据的一种存在形式
xml —— beanDefinition ——bean 从xml配置bean ,到解析xml创建 beanDefinition , 到从beanDefinition实例为 bean对象,这是一个流程。
docoment对象的解析过程委托给了BeanDefinitionDocumentReader对象来完成:
DefaultBeanDefinitionDocumentReader.registerBeanDefinitions()方法
委托给document的解析器,入参为document的根元素,就是spring-context.xml的beans元素:
到此为止,XML配置文件就加载完成了,