Spring IOC 學習四 之BeanDefinition
第一篇:Spring IOC 學習一
第二篇: Spring IOC 學習二之 資源載入
第三篇: Spring IOC 學習三 之ApplicationContext容器面紗
上篇就講到 loadBeanDefinitions()方法了,該方法是一個抽象方法具體實現是在子類AbstractXmlApplicationContext 整個方法具體實現入截圖:
每段程式碼上都有解釋,就不一一寫在下面了。

可以看到最後一行程式碼又是loadBeanDefinitions()這次傳的引數確實 XmlBeanDefinitionReader例項具體操作我們看一下。

首先獲取Resource結構是否為空,如果不為空則執行如下介面

上面loadBeanDefinitions(resoruce)方法在介面BeanDefinitionReader中,具體實現卻又三個如下:

因為我用的是ClassPathXmlApplicationContext 所以我們就選擇XmlBeanDefinitionReader進入,過載的時候講resource進行了重編碼



上面程式碼中我們就能看到,
1、先是載入當前載入過的資源。
2、如果已經存在了當前資源就丟擲異常
3、然後將resource轉成inputStream,再轉成inputSource
4、核心方法就是 從對應的xml中載入beanDefinition 。doLoadBeanDefinitions(inputSource, encodedResource.getResource());

這裡重要2行程式碼,
一是將資源轉成document結構,
二是從給定的doc結構中註冊bean definitions 程式碼如下:

1、通過反射方式完成BeanDefinitionDocumentReader的例項 程式碼如下:

2、從給定的DOM文件中讀取bean定義,並在給定的讀取器上下文中將它們註冊到登錄檔中

該方法BeanDefinitionDocumentReader的一個結構,具體實現是DefaultBeanDefinitionDocumentReader 的 registerBeanDefinitions程式碼結構如下:

核心程式碼如下

第一步:獲取用於解析XML bean定義的有狀態委託類例項
第二步:判斷是否Spring bean結構,如果是的判斷是否有profile 屬性,則直接return(因為spr12458不能使用profile .of(…),因為XML config不支援profile表示式)
第三步:解析xml檔案內容

詳細結構:

整個資原始檔的解析委託鏈有以下四個主要類:
ClassPathXmlApplicationContext,作為最外圍的元件,發起解析的請求
XmlBeanDefinitionReader,將配置檔案路徑封裝為Resource,讀取出w3c定義的Document物件,然後委託給
DefaultBeanDefinitionDocumentReader,接著上面的委託開始做實際的解析工作,因為需要非常詳細的解析每一個bean,所以它又會繼續委託給
BeanDefinitionParserDelegate,最終解析類。進入該類就會發現很多xml種的屬性名稱
部分截圖:

OK ,容器對XML的解析基本就結束了。