摘要:本文結合《Spring源碼深度解析》來分析Spring 5.0.6版本的源代碼。若有描述錯誤之處,歡迎指正。
在上一篇文章中,我們熟悉了容器的基本用法。在這一篇,我們開始分析Spring的源碼。但是在正式開始熟悉源碼之前,有必要了解一下Spring中最核心的兩個類。
1. DefaultListableBeanFactory
XmlBeanFactory繼承自DefaultListableBeanFactory,而DefaultListableBeanFactory是整個bean加載的核心部分,是Spring注冊及加載bean的默認實現,而對於XmlBeanFactory與DefaultListableBeanFactory不同的地方其實是在XmlBeanFactory中使用了自定義的XML讀取器XmlBeanDefinitionReader,實現了個性化的BeanDefinitionReader讀取,DefaultListableBeanFactory繼承了AbstractAutowireCapableBeanFactory並實現了ConfigurableListableBeanFactory以及BeanDefinitionRegistry接口。以下是DefaultListableBeanFactory的類圖:
從上面的類圖中,我們可以清晰地從全局角度了解DefaultListableBeanFactory的脈絡。接下來先了解一下上面類圖中各個類的作用。
AliasRegistry | 定義對alias的簡單增刪改查等操作 |
SimpleAliasRegistry | 主要使用map作為alias的緩存,並對接口AliasRegistry進行實現 |
SingletonBeanRegistry | 定義對單例的注冊及獲取 |
BeanFactory | 定義獲取bean及bean的各種屬性 |
DefaultSingletonBeanFactory | 對接口SingletonBeanRegistry各函數的實現 |
HierarchicalBeanFactory | 繼承BeanFactory,也就是在BeanFactory定義的功能的基礎上增加了對parentFactory的支持 |
BeanDefinitionRegistry | 定義對BeanDefinition的各種增刪改操作 |
FactoryBeanRegistrySupport | 在DefaultSingletonBeanRegistry的基礎上增加了對FactoryBean的特殊處理功能 |
ConfigurableBeanFactory | 提供配置Factory的各種方法 |
ListableBeanFactory | 根據各種條件獲取bean的配置清單 |
AbstractBeanFactory | 綜合FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能 |
AutowireCapableBeanFactory | 提供創建bean、自動注入,初始化以及應用bean的后處理器 |
AbstractAutowireCapableBeanFactory | 綜合AbstractBeanFactory並對接口AutowireCapableBeanFactory進行實現 |
ConfigurableListableBeanFactory | BeanFactory配置清單,指定忽略類型及接口等 |
DefaultListableBeanFactory | 綜合上面所有功能,主要是對Bean注冊后的處理 |
XmlBeanFactory對DefaultListableBeanFactory進行了擴展,主要用於從XML文檔中讀取BeanDefinition,對於注冊及獲取Bean都是使用從父類DefaultListableBeanFactory繼承的方法去實現,而唯獨與父類不同的個性化實現就是增加了XmlBeanDefinitionReader類型的reader屬性。在XmlBeanFactory中主要使用reader屬性對資源文件進行讀取和注冊。
2. XmlBeanDefinitionReader
XML配置文件的讀取時Spring的重要功能,因為Spring的大部分功能都是以配置作為切入點的,那么我們可以從XmlBeanDefinitionReader中梳理一下資源文件讀取、解析及注冊的大致脈絡。首先我們看看各個類的功能。
ResourceLoader | 定義資源加載器,主要應用於根據給定的資源文件地址返回對應的Resource |
BeanDefinitionReader | 主要定義資源文件讀取並轉換為BeanDefinition的各個功能 |
EnvironmentCapable | 定義獲取Environment方法 |
DocumentLoader | 定義從資源文件加載到轉換為Document的功能 |
AbstractBeanDefinitionReader | 對EnvironmentCapable、BeanDefinitionReader類定義的功能進行實現 |
BeanDefinitionDocumentReader | 定義讀取Document並注冊BeanDefiniton功能 |
BeanDefinitionParserDelegate | 定義解析Element的各種方法 |
通過以上分析,我們可以梳理出整個XML配置文件讀取的大致流程,如下圖所示:
在XmlBeanDifinitonReader中主要包含以下幾個步驟的處理:
1)通過繼承自AbstractBeanDefinitionReader中的方法,來使用ResourceLoader將資源文件路徑轉換為對應的Resource文件。
2)通過DocumentLoader對Resource文件進行轉換,將Resource文件轉換為Document文件。
3)通過實現接口BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader類對Document進行解析,並使用BeanDefinitionParserDelegate對Element進行解析。