您好,登錄后才能下訂單哦!
這篇文章給大家介紹XmlBeanFactory如何初始化,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
XmlBeanFactory繼承DefaultListableBeanFactory,關系圖如下
內部通過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標簽進行處理。
首先我們對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子元素(這是第二部)。
解析默認bean的各種屬性是通過方法parseBeanDefinitionAttributes完成的,對element所有屬性進行解析,例如singleton、scope、abstract、lazy-init、autowire、depends-on等屬性
解析完屬性后再解析子元素的meta
解析子元素lookup-method,又稱為獲取器注入,是一種特殊的方法注入,它是把一個方法聲明為返回某種類型的bean,但實際要返回的bean是在配置文件里面配置的,此方法可用在設計有些可插撥的功能上,接觸程序依賴。
解析子元素replaced-method,可以在運行時用新的方法替換現有的方法,與之前look-up不同,replaced-method不但可以動態替換返回實體bean,而且還能動態更改原有方法的邏輯。提取name屬性(要替換的舊的方法),提取replacer屬性(新的替換方法)
關于XmlBeanFactory如何初始化就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。