spring源码深度解析—容器的基本实现,你知多少?( 二 )


spring源码深度解析—容器的基本实现,你知多少?

文章插图
 
上面类图中各个类及接口的作用如下: 
- AliasRegistry:定义对alias的简单增删改等操作 
- SimpleAliasRegistry:主要使用map作为alias的缓存 , 并对接口AliasRegistry进行实现 
- SingletonBeanRegistry:定义对单例的注册及获取 
- BeanFactory:定义获取bean及bean的各种属性 
- DefaultSingletonBeanRegistry:默认对接口SingletonBeanRegistry各函数的实现 
- HierarchicalBeanFactory:继承BeanFactory , 也就是在BeanFactory定义的功能的基础上增加了对parentFactory的支持 
- BeanDefinitionRegistry:定义对BeanDefinition的各种增删改操作 
- FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能 
- ConfigurableBeanFactory:提供配置Factory的各种方法 
- ListableBeanFactory:根据各种条件获取bean的配置清单 
- AbstractBeanFactory:综合FactoryBeanRegistrySupport和ConfigurationBeanFactory的功能 
- AutowireCapableBeanFactory:提供创建bean、自动注入、初始化以及应用bean的后处理器 
- AbstractAutowireCapableBeanFactory:综合AbstractBeanFactory并对接口AutowireCapableBeanFactory进行实现 
- ConfigurableListableBeanFactory:BeanFactory配置清单 , 指定忽略类型及接口等 
- DefaultListableBeanFactory:综合上面所有功能 , 主要是对Bean注册后的处理 
XmlBeanFactory对DefaultListableBeanFactory类进行了扩展 , 主要用于从XML文档中读取BeanDefinition , 对于注册及获取Bean都是使用从父类DefaultListableBeanFactory继承的方法去实现 , 而唯独与父类不同的个性化实现就是增加了XmlBeanDefinitionReader类型的reader属性 。在XmlBeanFactory中主要使用reader属性对资源文件进行读取和注册 
4.2.2 XmlBeanDefinitionReader 
XML配置文件的读取是Spring中重要的功能 , 因为Spring的大部分功能都是以配置作为切入点的 , 可以从XmlBeanDefinitionReader中梳理一下资源文件读取、解析及注册的大致脉络 , 先看看各个类的功能
ResourceLoader:定义资源加载器 , 主要应用于根据给定的资源文件地址返回对应的Resource 
BeanDefinitionReader:主要定义资源文件读取并转换为BeanDefinition的各个功能 
EnvironmentCapable:定义获取Environment方法 
DocumentLoader:定义从资源文件加载到转换为Document的功能 
AbstractBeanDefinitionReader:对EnvironmentCapable、BeanDefinitionReader类定义功能进行实现 
BeanDefinitionDocumentReader:定义读取Document并注册BeanDefinition功能 
BeanDefinitionParserDelegate:定义解析Element的各种方法 
整个XML配置文件读取的大致流程 , 在XmlBeanDefinitionReader中主要包含以下几步处理 
spring源码深度解析—容器的基本实现,你知多少?

文章插图
 
(1)通过继承自AbstractBeanDefinitionReader中的方法 , 来使用ResourceLoader将资源文件路径转换为对应的Resource文件 
(2)通过DocumentLoader对Resource文件进行转换 , 将Resource文件转换为Document文件 
(3)通过实现接口BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader类对Document进行解析 , 并使用BeanDefinitionParserDelegate对Element进行解析
5. 容器的基础XmlBeanFactory通过上面的内容我们对spring的容器已经有了大致的了解 , 接下来我们详细探索每个步骤的详细实现 , 接下来要分析的功能都是基于如下代码:
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-bean.xml"));通过XmlBeanFactory初始化时序图看一看上面代码的执行逻辑 , 如下图所示: 
spring源码深度解析—容器的基本实现,你知多少?

文章插图
 
时序图从TestDemo测试类开始 , 首先调用ClassPathResource的构造函数来构造Resource资源文件的实例对象 , 这样后续的资源处理就可以用Resource提供的各种服务来操作了 。有了Resource后就可以对BeanFactory进行初始化操作 , 那配置文件是如何封装的呢? 
5.1 配置文件的封装 
Spring的配置文件读取是通过ClassPathResource进行封装的 , Spring对其内部使用到的资源实现了自己的抽象结构:Resource接口来封装底层资源 , 如下源码:


推荐阅读