天天看點

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

ClassPathXmlApplicationContext的構造函數裡,一部分邏輯是給各個成員變量賦上初始值:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

然後是執行refresh操作。

擷取ConfigurableListableBeanFactory:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

來自Beans.xml的bean,被解析出來後,就存儲在BeanFactory的成員變量beanDefinitionMap裡。

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

那麼Beans.xml裡的bean定義,是如何被解析的呢?

進入abstractApplicationContext裡看個究竟:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

loadBeanDefintions方法:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

進入AbstractXmlApplicationContext的loadBeanDefinitions方法:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

從Beans.xml處讀取并解析bean定義:reader.loadBeanDefinitions(configLocations);

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

遞歸調用方法AbstractBeanDefinitionReader的loadBeanDefinitions:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的
ava Spring Beans.xml裡的Bean定義是如何被解析出來的

遞歸調用loadBeanDefinitions,此時這個方法接收的輸入參數成為了Resource類型:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

進入了XmlBeanDefinitionReader.loadBeanDefinitions方法:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

開始對Beans.xml檔案進行IO操作:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

将Java IO操作傳回的inputSource傳入doLoadDocument:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

使用documentBuilder解析Beans.xml:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

countBefore為0,然後進行registerBeanDefinitions操作:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

在registerBeanDefintions方法裡,通過org.w3c.dom.Element提供的XML API進行解析:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

解析分為preProcess,parseBeanDefinitions和postProcess三個步驟:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

進入這個IF分支,說明在Beans.xml裡找到了一個bean節點:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

這就是解析出來的beanDefinition:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的

在Beans.xml裡的bean定義如下:

ava Spring Beans.xml裡的Bean定義是如何被解析出來的