最近在读《Spring源码深度分析》这本书,虽然讲的是Spring3.0版本的东西,但是基本的思想还是相同的。所以我打算一边读一边做一些总结,一方面在看过一边之后再捋一遍整体的过程,另一方面也防止日后忘记某些东西无处可查。
在开始源码阅读之前,我们首先要了解一下Spring中常用的一些类的名称和作用,不然很有可能到最后把自己绕晕了。以下大部分摘自书中的原话
Spring获取bean一般使用ApplicationContext来获取,而ApplicationContext实现了BeanFactory的所有功能,同时对其进行了功能的扩展,所以我们要了解ApplicationContext之前首先需要弄清楚BeanFactory的结构组成,下面我们就看一下BeanFactory的一个实现类XmlBeanFactory的结构。
DefaultListableBeanFactory:我们平时所熟知的XmlBeanFactory就是继承自这个类的,所以这个类的重要程度不言而喻,它是整个bean加载过程中的核心部分,是Spring注册及加载bean的默认实现,它与XmlBeanFactory的区别是XmlBeanFactory使用了自定义的XML读取器XmlBeanDefinitionReader,实现了个性化的BeanDefinitionReader读取。DefaultListableBeanFactory继承自AbstractAutowireCapableBeanFactory实现了ConfigurableListableBeanFactory和BeanDefinitionRegistry接口。下面是DefaultListableBeanFactory的层次结构图
下面是上图中出现的各个类的作用
AliasRegistry:定义对alias的简单的增删改查操作
SimpleAliasRegistry:是AliasRegistry接口的实现,使用map作为alias的缓存
SingletonBeanRegistry:定义对单例的注册和获取
BeanFactory:定义获取bean及bean的各种属性
DefaultSingletonBeanRegistry:对接口SingletonBeanRegistry各函数的实现,同时继承了SimpleAliasRegistry
HierarchicalBeanFactory:继承BeanFactory,主要是在BeanFactory的基础上增加了对parentFactory的支持
BeanDefinitionRegistry:定义对BeanDefinition的各种增删改查
FactoryBeanRegistrySupport:继承自DefaultSingletonBeanRegistry,在此基础上增加了对FactoryBean的特殊处理功能
ConfigurableBeanFactory:继承了HierachicalBeanFactory和SingletonBeanRegistry接口,提供了配置Factory的各种方法
ListableBeanFactory:继承BeanFactory接口,根据各种条件获取bean的配置清单
AbstractBeanFactory:继承FactoryBeanRegistrySupport和实现了ConfigurableBeanFactory接口,综合了它们的功能
AutowireCapableBeanFactory:继承了BeanFactory接口,提供创建bean,自动注入,初始化以及应用bean的后处理器
AbstractAutowireCapableBeanFactory:继承了AbstractBeanFactory和实现了AutowireCapableBeanFactory和接口
ConfigurableListableBeanFactory:实现了ConfigurableBeanFactory,ListableBeanFactory和AutowireCapableBeanFactory这三个接口, 主要为了给BeanFactory配置清单,指定忽略类型及接口等
DefaultLisableBeanFactory:继承了AbstractAutowireCapableBeanFactory,实现了BeanDifinitionRegistry,ConfigurableListaleBeanFa ctory和Serializable接口,综合了上述所有的功能,主要对Bean注册后处理
XmlBeanFactory对DefaultLisableBeanFactory进行了扩展,主要用于从XML文档中读取BeanDefinition,对于注册及获取bean都是从父类DefaultListableBeanFactory继承的方法去实现,唯一与父类不同的就是增加了XmlBeanDefinitionReader类型的reader属性,它的作用就是对资源文件进行读取和注册。下面我们来看看XmlBeanDefinitionReader的结构组成。
XML配置文件的读取是Spring中重要的功能,因为Spring中大部分功能都是以配置作为切入点的,那么我们可以从XmlBeanDefinitionReader中梳理一下资源文件读取、解析及注册的大致脉络,首先我们看看各个类的功能。
ResourceLoader:被AbstractBeanDefinitionReader引用的类,定义资源加载器,主要应用于根据给定的资源文件地址返回对应的Resource
BeanDefinitonReader:主要定义资源文件读取并转换为BeanDefinition的各个功能
EnvironmentCapable:定义获取Enviroment的方法
DocumentLoader:XmlBeanDefinitionReader引用的类定义从资源文件加载到转换为Document的功能,默认实现是DefaultDocumentLoader
AbstractBeanDefinitionReader:对EnvironmentCapable和BeanDefinitionReader接口的实现
BeanDefinitionDocumentReader:定义读取Document并注册BeanDefinition的功能,默认实现是DefaultBeanDefinitionDocumentReader
BeanDefinitionParserDelegate:不是被XmlBeanDefinitionReader直接引用而是被XmlBeanDefinitionReader引用的BeanDefinitionDocum ent引用的类,作用是定义解析Element的各种方法。
经过上面的介绍,我们可以大概的梳理出XML配置文件读取的大致的流程:
(1)通过继承自AbstractBeanDefinitionReader中的方法,使用ResourceLoader将资源文件路径转换为对应的Resource文件
(2)通过DocumentLoader对Resource文件进行转换,将Resource文件转换为Document文件
(3)通过实现接口BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader类对Document进行解析,并使用BeanDefinitionParerDelegate对Element进行解析
至此,我们对于XmlBeanFactory的结构以及流程有了一个大致的了解,之后的文章再进行深入的了解和源码的分析