這篇文章給大家介紹XmlBeanFactory如何初始化,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
成都網(wǎng)站建設(shè)、成都網(wǎng)站制作介紹好的網(wǎng)站是理念、設(shè)計和技術(shù)的結(jié)合。創(chuàng)新互聯(lián)擁有的網(wǎng)站設(shè)計理念、多方位的設(shè)計風(fēng)格、經(jīng)驗豐富的設(shè)計團(tuán)隊。提供PC端+手機(jī)端網(wǎng)站建設(shè),用營銷思維進(jìn)行網(wǎng)站設(shè)計、采用先進(jìn)技術(shù)開源代碼、注重用戶體驗與SEO基礎(chǔ),將技術(shù)與創(chuàng)意整合到網(wǎng)站之中,以契合客戶的方式做到創(chuàng)意性的視覺化效果。
XmlBeanFactory繼承DefaultListableBeanFactory,關(guān)系圖如下
內(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的默認(rèn)實現(xiàn),這個接口根據(jù)“spring-beans”DTD and XSD格式(spring默認(rèn)xml的bean定義格式)讀取bean定義,xml文檔需要的結(jié)構(gòu)、元素、屬性在這個類里硬編碼,首先獲取Document對象的root,讀取root的profile屬性,有了這個屬性我們就可以在配置文件中部署兩套配置來適用于生產(chǎn)環(huán)境和開發(fā)環(huán)境,這樣可以方便地進(jìn)行切換開發(fā)、部署環(huán)境,最常用的就是更換不同的數(shù)據(jù)庫。parseBeanDefinitions就是進(jìn)行xml的讀取了。對于根節(jié)點或子節(jié)點如果是默認(rèn)命名空間的話則采用parseDefaultElement方法進(jìn)行解析,否則使用delegate.parseCustomElement方法對自定義命名空間進(jìn)行解析。而判斷是否是默認(rèn)命名空間還是自定義命名空間的辦法其實是使用node.getNamespaceURI()獲取命名空間,并與spring中固定的命名空間進(jìn)行比較。parseDefaultElement方法對import、alias、bean、beans標(biāo)簽進(jìn)行處理。
首先我們對bean標(biāo)簽進(jìn)行解析,首先委托BeanDefinitionParserDelegate類的parseBeanDefinitionElement方法進(jìn)行元素解析,返回BeanDefinitionHolder類型的實例bdHolder,經(jīng)過了這個方法后,bdHolder實例已經(jīng)包含了我們配置文件中配置的各種屬性了,例如class、name、id、alias之類的屬性。當(dāng)返回bdHolder不空的情況下若存在默認(rèn)標(biāo)簽的子節(jié)點下再有自定義屬性,還需要再對自定義標(biāo)簽進(jìn)行解析,解析完成后,需要對解析后的bdHolder進(jìn)行注冊,同樣,注冊曹祖委托給了BeanDefinitionReaderUtils的registerBeanDefinition方法,最后發(fā)出響應(yīng)事件,通知相關(guān)的監(jiān)聽器,這個bean已經(jīng)完成加載了。
BeanDefinitionParserDelegate類的parseBeanDefinitionElement提取元素的id及name屬性,進(jìn)一步解析其他所有屬性并統(tǒng)一封裝至GenericBeanDefinition實例中,如果檢測到bean沒有指定beanName,那么使用默認(rèn)規(guī)則為bean生成beanName,將獲取的信息封裝到BeanDefinitionHolder的實例中。parseBeanDefinitionElement方法創(chuàng)建用于承載屬性的AbstractBeanDefinition類型的GenericBeanDefinition(Spring通過BeanDefinition將配置文件中的
解析默認(rèn)bean的各種屬性是通過方法parseBeanDefinitionAttributes完成的,對element所有屬性進(jìn)行解析,例如singleton、scope、abstract、lazy-init、autowire、depends-on等屬性
解析完屬性后再解析子元素的meta
解析子元素lookup-method,又稱為獲取器注入,是一種特殊的方法注入,它是把一個方法聲明為返回某種類型的bean,但實際要返回的bean是在配置文件里面配置的,此方法可用在設(shè)計有些可插撥的功能上,接觸程序依賴。
解析子元素replaced-method,可以在運(yùn)行時用新的方法替換現(xiàn)有的方法,與之前l(fā)ook-up不同,replaced-method不但可以動態(tài)替換返回實體bean,而且還能動態(tài)更改原有方法的邏輯。提取name屬性(要替換的舊的方法),提取replacer屬性(新的替換方法)
關(guān)于XmlBeanFactory如何初始化就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。