本文主要讲解此段代码在Spring框架中的解析过程,第一步需要对Spring框架及其核心有一个初步的认识,所以我们先来了解下Spring框架的核心接口以及大体的解析过程。

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml"));

BeanFactory

BeanFactory是负责生产和管理bean的一个工厂,是IOC容器的一个核心接口,从它开始衍生出多种Spring容器的实现方式,例如XmlBeanFactory以及ApplicationContext,其中XmlBeanFactory是通过对Bean的XML配置文件进行解析来获取BeanDefinition,ApplicationContext则是SpringBoot中获取Bean的一个重要方式,主要通过解析注解来获取BeanDefinition。

BeanDefinition

BeanDefinition是BeanFactory解析的一个结果,有关于Bean的所有属性和配置都存放在这里面,其继承结构图如下,分为注解和XML两种,重点看XML相关,其中AbstractBeanDefinition的三个子类最为常用




spring xml指定激活的配置 spring xml启动_spring


XmlBeanFactory

下图为XmlBeanFactory的继承结构图


spring xml指定激活的配置 spring xml启动_java_02


XmlBeanFactory继承自DefaultListableBeanFactory,DefaultListableBeanFactory是整个bean加载的核心部分,是Spring注册及加载bean的默认实现,而XmlBeanFactory则对其进行扩展它个性化的增加了XmlBeanDefinitionReader,通过reader属性对资源文件进行读取和注册。

可以看到它除了继承了顶级接口BeanFactory外,还有两个额外的顶级接口,SingletonBeanRegistry和BeanDefinitionRegistry。SingletonBeanRegistry定义了对单例的注册和获取,从这里也可以看出,Spring框架的Bean默认是单例模式的,BeanDefinitionRegistry则定义了对BeanDefinition的各种增删改查操作。

ClassPathResource

在Spring中,Resource接口抽象了所有内部使用到的底层资源,如File、URL、Classpath等,并且提供了不同类型资源的转换以及将他们转换为Stream流等功能。

XmlBeanDefinitionReader

从名字可以看出,它主要负责对XML文件进行读取、解析以及注册,大致流程是将文件通过ResourceLoader将资源路径转换为Resource文件,再对其进行转换为Document文件,最后通过BeanDefinitionDocumentReader对Document文件进行解析并使用BeanDefinitionParserDelegate对Element进行解析。

总结

Spring中解析的核心就是以BeanFactory为首的一系列接口和实现类,通过他们在内部分为三步来将文件解析到内存当中并进行管理,第一步将路径文件或注解解析为Resource,第二步通过Reader对Resource进行读取并解析,形成BeanDefinition对象,第三步对BeanDefinition进行管理并生成Bean对象。