摘要:本文結合《Spring源碼深度解析》來分析Spring 5.0.6版本的源代碼。若有描述錯誤之處,歡迎指正。
在上一篇文章中,我們熟悉了容器的基本用法。在這一篇,我們開始分析Spring的源碼。但是在正式開始熟悉源碼之前,有必要了解一下Spring中最核心的兩個類。
XmlBeanFactory繼承自DefaultListableBeanFactory,而DefaultListableBeanFactory是整個bean加載的核心部分,是Spring注冊及加載bean的預設實作,而對于XmlBeanFactory與DefaultListableBeanFactory不同的地方其實是在XmlBeanFactory中使用了自定義的XML讀取器XmlBeanDefinitionReader,實作了個性化的BeanDefinitionReader讀取,DefaultListableBeanFactory繼承了AbstractAutowireCapableBeanFactory并實作了ConfigurableListableBeanFactory以及BeanDefinitionRegistry接口。以下是DefaultListableBeanFactory的類圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5COlNTO2QjM4ITN1YTO2UmZ1gDMkJ2YzAjZjRTNjljNw8CX1AzLcVDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL4M3Lc9CX6MHc0RHaiojIsJye.png)
從上面的類圖中,我們可以清晰地從全局角度了解DefaultListableBeanFactory的脈絡。接下來先了解一下上面類圖中各個類的作用。
XmlBeanFactory對DefaultListableBeanFactory進行了擴充,主要用于從XML文檔中讀取BeanDefinition,對于注冊及擷取Bean都是使用從父類DefaultListableBeanFactory繼承的方法去實作,而唯獨與父類不同的個性化實作就是增加了XmlBeanDefinitionReader類型的reader屬性。在XmlBeanFactory中主要使用reader屬性對資源檔案進行讀取和注冊。
XML配置檔案的讀取時Spring的重要功能,因為Spring的大部分功能都是以配置作為切入點的,那麼我們可以從XmlBeanDefinitionReader中梳理一下資源檔案讀取、解析及注冊的大緻脈絡。首先我們看看各個類的功能。
通過以上分析,我們可以梳理出整個XML配置檔案讀取的大緻流程,如下圖所示:
在XmlBeanDifinitonReader中主要包含以下幾個步驟的處理:
1)通過繼承自AbstractBeanDefinitionReader中的方法,來使用ResourceLoader将資源檔案路徑轉換為對應的Resource檔案。
2)通過DocumentLoader對Resource檔案進行轉換,将Resource檔案轉換為Document檔案。
3)通過實作接口BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader類對Document進行解析,并使用BeanDefinitionParserDelegate對Element進行解析。