1. 程式人生 > >Spring原始碼深度解析總結(1)——XmlBeanFactory的結構組成

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

:繼承BeanFactory,主要是在BeanFactory的基礎上增加了對parentFactory的支援

    BeanDefinitionRegistry:定義對BeanDefinition的各種增刪改查

    FactoryBeanRegistrySupport:繼承自DefaultSingletonBeanRegistry,在此基礎上增加了對FactoryBean的特殊處理功能

    ConfigurableBeanFactory:繼承了HierachicalBeanFactorySingletonBeanRegistry介面,提供了配置Factory的各種方法

    ListableBeanFactory:繼承BeanFactory介面,根據各種條件獲取bean的配置清單

    AbstractBeanFactory:繼承FactoryBeanRegistrySupport和實現了ConfigurableBeanFactory介面,綜合了它們的功能

    AutowireCapableBeanFactory:繼承了BeanFactory介面,提供建立bean,自動注入,初始化以及應用bean的後處理器

    AbstractAutowireCapableBeanFactory:繼承了AbstractBeanFactory和實現了AutowireCapableBeanFactory和介面

 ConfigurableListableBeanFactory:實現了ConfigurableBeanFactoryListableBeanFactoryAutowireCapableBeanFactory這三個介面,                                                                  主要為了給BeanFactory配置清單,指定忽略型別及介面等

 DefaultLisableBeanFactory:繼承了AbstractAutowireCapableBeanFactory,實現了BeanDifinitionRegistryConfigurableListaleBeanFa                                                        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:對EnvironmentCapableBeanDefinitionReader介面的實現

    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的結構以及流程有了一個大致的瞭解,之後的文章再進行深入的瞭解和原始碼的分析