ClassPathXmlApplicationContext的構造函數裡,一部分邏輯是給各個成員變量賦上初始值:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SM2EjM5MWYkVTOiBTN1gDO3ETO0UTZjhDOlZmY2AzMi9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
然後是執行refresh操作。
擷取ConfigurableListableBeanFactory:
來自Beans.xml的bean,被解析出來後,就存儲在BeanFactory的成員變量beanDefinitionMap裡。
那麼Beans.xml裡的bean定義,是如何被解析的呢?
進入abstractApplicationContext裡看個究竟:
loadBeanDefintions方法:
進入AbstractXmlApplicationContext的loadBeanDefinitions方法:
從Beans.xml處讀取并解析bean定義:reader.loadBeanDefinitions(configLocations);
遞歸調用方法AbstractBeanDefinitionReader的loadBeanDefinitions:
遞歸調用loadBeanDefinitions,此時這個方法接收的輸入參數成為了Resource類型:
進入了XmlBeanDefinitionReader.loadBeanDefinitions方法:
開始對Beans.xml檔案進行IO操作:
将Java IO操作傳回的inputSource傳入doLoadDocument:
使用documentBuilder解析Beans.xml:
countBefore為0,然後進行registerBeanDefinitions操作:
在registerBeanDefintions方法裡,通過org.w3c.dom.Element提供的XML API進行解析:
解析分為preProcess,parseBeanDefinitions和postProcess三個步驟:
進入這個IF分支,說明在Beans.xml裡找到了一個bean節點:
這就是解析出來的beanDefinition:
在Beans.xml裡的bean定義如下: