Spring原始碼深度解析總結(1)——XmlBeanFactory的結構組成
最近在讀《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
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的結構以及流程有了一個大致的瞭解,之後的文章再進行深入的瞭解和原始碼的分析