XmlBeanFactory繼承DefaultListableBeanFactory,關係圖以下node
內部經過XmlBeanDefinitionReader來從xml中讀取bean的定義,即委託給XmlBeanDefinitionReader,XmlBeanDefinitionReader是讀取xml的bean定義,委託實際的xml文檔讀取給BeanDefinitionDocumentReader,這個類加載一個DOM文檔給BeanDefinitionDocumentReader使用,它使用給定的bean的factory註冊bean的定義。在XmlBeanFactory初始化時,調用XmlBeanDefinitionReader的loadBeanDefinitions,內部將Resource對象構形成EncodedResource對象。調用loadBeanDefinitions,內部將EncodedResource對象添加到resourcesCurrentlyBeingLoaded線程對象中,經過EncodedResource對象構形成InputSource對象。調用doLoadBeanDefinitions,內部首先初始化Document對象,經過documentLoader構造Document對象,調用registerBeanDefinitions,內部經過BeanDefinitionDocumentReader對象註冊bean實例。調用BeanDefinitionDocumentReader的registerBeanDefinitions,BeanDefinitionDocumentReader是BeanDefinitionDocumentReader的默認實現,這個接口根據「spring-beans」DTD and XSD格式(spring默認xml的bean定義格式)讀取bean定義,xml文檔須要的結構、元素、屬性在這個類裏硬編碼,首先獲取Document對象的root,讀取root的profile屬性,有了這個屬性咱們就能夠在配置文件中部署兩套配置來適用於生產環境和開發環境,這樣能夠方便地進行切換開發、部署環境,最經常使用的就是更換不一樣的數據庫。parseBeanDefinitions就是進行xml的讀取了。對於根節點或子節點若是是默認命名空間的話則採用parseDefaultElement方法進行解析,不然使用delegate.parseCustomElement方法對自定義命名空間進行解析。而判斷是不是默認命名空間仍是自定義命名空間的辦法實際上是使用node.getNamespaceURI()獲取命名空間,並與spring中固定的命名空間進行比較。parseDefaultElement方法對import、alias、bean、beans標籤進行處理。spring
首先咱們對bean標籤進行解析,首先委託BeanDefinitionParserDelegate類的parseBeanDefinitionElement方法進行元素解析,返回BeanDefinitionHolder類型的實例bdHolder,通過了這個方法後,bdHolder實例已經包含了咱們配置文件中配置的各類屬性了,例如class、name、id、alias之類的屬性。當返回bdHolder不空的狀況下若存在默認標籤的子節點下再有自定義屬性,還須要再對自定義標籤進行解析,解析完成後,須要對解析後的bdHolder進行註冊,一樣,註冊曹祖委託給了BeanDefinitionReaderUtils的registerBeanDefinition方法,最後發出響應事件,通知相關的監聽器,這個bean已經完成加載了。數據庫
BeanDefinitionParserDelegate類的parseBeanDefinitionElement提取元素的id及name屬性,進一步解析其餘全部屬性並統一封裝至GenericBeanDefinition實例中,若是檢測到bean沒有指定beanName,那麼使用默認規則爲bean生成beanName,將獲取的信息封裝到BeanDefinitionHolder的實例中。parseBeanDefinitionElement方法建立用於承載屬性的AbstractBeanDefinition類型的GenericBeanDefinition(Spring經過BeanDefinition將配置文件中的<bean>配置信息轉換爲容器的內部表示,並將這些BeanDefinition註冊到BeanDefinitionRegistry中,這是第一步),而後硬編碼解析默認bean的各類屬性,解析元數據,解析lookup-method、replaced-method屬性,解析構造函數參數,解析property子元素,解析qualifier子元素(這是第二部)。函數