Mybatis全局配置對(duì)象的創(chuàng)建流程

作者:梁飛 叩丁狼教育高級(jí)講師。原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處。

源碼分析-Mybatis全局配置對(duì)象的創(chuàng)建

Mybatis所有的配置信息以及mapper的配置信息,全部存儲(chǔ)于Configuration對(duì)象中,Configuration相當(dāng)于Mybatis的對(duì)象實(shí)體。Configuration對(duì)象從初始創(chuàng)建會(huì)一直貫穿Mybatis運(yùn)行的整個(gè)生命周期,為Mybatis的運(yùn)行提供必要的配置信息。Mybatis全局配置對(duì)象創(chuàng)建的過程,就是給Configuration對(duì)象中屬性賦值的過程。

首先,在Mybatis開始運(yùn)行時(shí),首先需要?jiǎng)?chuàng)建SqlSessionFactoryBuilder對(duì)象,在調(diào)用該對(duì)象的build方法時(shí),把讀取了主配置文件的輸入流作為參數(shù)來(lái)創(chuàng)建SqlSessionFactory對(duì)象。

可以直接進(jìn)入到build的方法中查看其執(zhí)行過程


在SqlSessionFactoryBuilder類中存在多個(gè)重載的方法,名字都為build,最終都會(huì)執(zhí)行參數(shù)為configuration的方法,而configuration對(duì)象就是由XMLConfigbuilder對(duì)象的parse方法返回??梢灾苯舆M(jìn)入到parse方法中,代碼截圖如下:


在XMLConfigbuilder的parse方法中,會(huì)首先判斷配置文件是否已經(jīng)解析過。核心的方法顯然是在調(diào)用parseConfiguration方法。該方法以一個(gè)XNode的對(duì)象作為參數(shù),從方法的源代碼中可以很容易的看出來(lái),每一個(gè)方法就是在解析mybatis.xml主配置文件中的某一個(gè)節(jié)點(diǎn)信息,同時(shí)將解析出的值付給configuration對(duì)象下相應(yīng)的屬性中。

以propertiesElement方法為例,

該方法同樣以一個(gè)XNode對(duì)象作為參數(shù)。首先讀取除了properties節(jié)點(diǎn)下所有的子節(jié)點(diǎn),然后在添加上resource或者url屬性對(duì)應(yīng)的資源文件的屬性值。最終把所有的屬性配置相關(guān)的信息賦值給configuration對(duì)象中的variables屬性中。

再如解析mapper配置信息的方法為mapperElement:

循環(huán)mapper標(biāo)簽中所有的子節(jié)點(diǎn),同樣讀取resource或者url或者class對(duì)應(yīng)的資源文件的的信息,調(diào)用XMLMapperBuilder對(duì)象的parse方法來(lái)解析對(duì)應(yīng)的mapper映射文件。

當(dāng)XMLConfigbuilder對(duì)象中的parseConfiguration方法執(zhí)行結(jié)束時(shí),configuration對(duì)象就初始化完成。為了更好的理解整個(gè)過程,現(xiàn)對(duì)兩個(gè)類進(jìn)行一個(gè)詳細(xì)說明,分別為XPathParser和XNode。

XPathParser是Mybatis一個(gè)核心的類,通過類名可以預(yù)測(cè)該類是在對(duì)XPath進(jìn)行解析,即對(duì)xml配置文件進(jìn)行解析。XMLConfigbuilder中有該類的一個(gè)屬性。


該類中的方法主要分成兩類,構(gòu)造方法和evalXXX。

每個(gè)構(gòu)造方法中都會(huì)執(zhí)行commonConstructor和createDocument。commonConstructor主要對(duì)當(dāng)前對(duì)象的基本屬性設(shè)置了初始值。createDocument方法主要對(duì)創(chuàng)建document對(duì)象時(shí)用到的兩個(gè)對(duì)象DocumentBuilderFactory和DocumentBuilder設(shè)置了初始值。

而evalXXX方法則是來(lái)解析節(jié)點(diǎn)的方法。例如解析布爾類型的方法有兩個(gè)。其余類型的解析方法都是大同小異的。


另一個(gè)類XNode是對(duì)org.w3c.dom.Node類的一個(gè)封裝,在Node類的基礎(chǔ)上添加了一些新功能。其構(gòu)造方法如下:

parseBody:設(shè)置body屬性的值

evalXXX:解析節(jié)點(diǎn)

getXXXBody:獲取body屬性的值并將其轉(zhuǎn)換為對(duì)應(yīng)的類型

getXXXAttribute:獲取屬性的值,并轉(zhuǎn)化為相應(yīng)的類型

getChildren:獲取所有類型為元素節(jié)點(diǎn)的子節(jié)點(diǎn)

getChildrenAsProperties:將所有類型為元素節(jié)點(diǎn)的子節(jié)點(diǎn)以properties形式返回。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容