溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

XmlBeanFactory如何初始化

發(fā)布時間:2021-07-30 14:26:33 來源:億速云 閱讀:113 作者:Leah 欄目:大數(shù)據(jù)

這篇文章給大家介紹XmlBeanFactory如何初始化,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

XmlBeanFactory繼承DefaultListableBeanFactory,關(guān)系圖如下

XmlBeanFactory如何初始化

內(nèi)部通過XmlBeanDefinitionReader來從xml中讀取bean的定義,即委托給XmlBeanDefinitionReader,XmlBeanDefinitionReader是讀取xml的bean定義,委托實際的xml文檔讀取給BeanDefinitionDocumentReader,這個類加載一個DOM文檔給BeanDefinitionDocumentReader使用,它使用給定的bean的factory注冊bean的定義。在XmlBeanFactory初始化時,調(diào)用XmlBeanDefinitionReader的loadBeanDefinitions,內(nèi)部將Resource對象構(gòu)造成EncodedResource對象。調(diào)用loadBeanDefinitions,內(nèi)部將EncodedResource對象添加到resourcesCurrentlyBeingLoaded線程對象中,通過EncodedResource對象構(gòu)造成InputSource對象。調(diào)用doLoadBeanDefinitions,內(nèi)部首先初始化Document對象,通過documentLoader構(gòu)造Document對象,調(diào)用registerBeanDefinitions,內(nèi)部通過BeanDefinitionDocumentReader對象注冊bean實例。調(diào)用BeanDefinitionDocumentReader的registerBeanDefinitions,BeanDefinitionDocumentReader是BeanDefinitionDocumentReader的默認實現(xiàn),這個接口根據(jù)“spring-beans”DTD and XSD格式(spring默認xml的bean定義格式)讀取bean定義,xml文檔需要的結(jié)構(gòu)、元素、屬性在這個類里硬編碼,首先獲取Document對象的root,讀取root的profile屬性,有了這個屬性我們就可以在配置文件中部署兩套配置來適用于生產(chǎn)環(huán)境和開發(fā)環(huán)境,這樣可以方便地進行切換開發(fā)、部署環(huán)境,最常用的就是更換不同的數(shù)據(jù)庫。parseBeanDefinitions就是進行xml的讀取了。對于根節(jié)點或子節(jié)點如果是默認命名空間的話則采用parseDefaultElement方法進行解析,否則使用delegate.parseCustomElement方法對自定義命名空間進行解析。而判斷是否是默認命名空間還是自定義命名空間的辦法其實是使用node.getNamespaceURI()獲取命名空間,并與spring中固定的命名空間進行比較。parseDefaultElement方法對import、alias、bean、beans標(biāo)簽進行處理。

首先我們對bean標(biāo)簽進行解析,首先委托BeanDefinitionParserDelegate類的parseBeanDefinitionElement方法進行元素解析,返回BeanDefinitionHolder類型的實例bdHolder,經(jīng)過了這個方法后,bdHolder實例已經(jīng)包含了我們配置文件中配置的各種屬性了,例如class、name、id、alias之類的屬性。當(dāng)返回bdHolder不空的情況下若存在默認標(biāo)簽的子節(jié)點下再有自定義屬性,還需要再對自定義標(biāo)簽進行解析,解析完成后,需要對解析后的bdHolder進行注冊,同樣,注冊曹祖委托給了BeanDefinitionReaderUtils的registerBeanDefinition方法,最后發(fā)出響應(yīng)事件,通知相關(guān)的監(jiān)聽器,這個bean已經(jīng)完成加載了。

BeanDefinitionParserDelegate類的parseBeanDefinitionElement提取元素的id及name屬性,進一步解析其他所有屬性并統(tǒng)一封裝至GenericBeanDefinition實例中,如果檢測到bean沒有指定beanName,那么使用默認規(guī)則為bean生成beanName,將獲取的信息封裝到BeanDefinitionHolder的實例中。parseBeanDefinitionElement方法創(chuàng)建用于承載屬性的AbstractBeanDefinition類型的GenericBeanDefinition(Spring通過BeanDefinition將配置文件中的<bean>配置信息轉(zhuǎn)換為容器的內(nèi)部表示,并將這些BeanDefinition注冊到BeanDefinitionRegistry中,這是第一步),然后硬編碼解析默認bean的各種屬性,解析元數(shù)據(jù),解析lookup-method、replaced-method屬性,解析構(gòu)造函數(shù)參數(shù),解析property子元素,解析qualifier子元素(這是第二部)。

  • 解析默認bean的各種屬性是通過方法parseBeanDefinitionAttributes完成的,對element所有屬性進行解析,例如singleton、scope、abstract、lazy-init、autowire、depends-on等屬性

  • 解析完屬性后再解析子元素的meta

  • 解析子元素lookup-method,又稱為獲取器注入,是一種特殊的方法注入,它是把一個方法聲明為返回某種類型的bean,但實際要返回的bean是在配置文件里面配置的,此方法可用在設(shè)計有些可插撥的功能上,接觸程序依賴。

  • 解析子元素replaced-method,可以在運行時用新的方法替換現(xiàn)有的方法,與之前l(fā)ook-up不同,replaced-method不但可以動態(tài)替換返回實體bean,而且還能動態(tài)更改原有方法的邏輯。提取name屬性(要替換的舊的方法),提取replacer屬性(新的替換方法)

關(guān)于XmlBeanFactory如何初始化就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI