ClassPathXmlApplicationContext的構造函數裏,一部分邏輯是給各個成員變量賦上初始值:dom
而後是執行refresh操做。函數
獲取ConfigurableListableBeanFactory:post
來自Beans.xml的bean,被解析出來後,就存儲在BeanFactory的成員變量beanDefinitionMap裏。ui
那麼Beans.xml裏的bean定義,是如何被解析的呢?spa
進入abstractApplicationContext裏看個究竟:3d
loadBeanDefintions方法:xml
進入AbstractXmlApplicationContext的loadBeanDefinitions方法:blog
從Beans.xml處讀取並解析bean定義:reader.loadBeanDefinitions(configLocations);
遞歸
遞歸調用方法AbstractBeanDefinitionReader的loadBeanDefinitions:rem
遞歸調用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定義以下:
要獲取更多Jerry的原創文章,請關注公衆號"汪子熙":