作者:梁飛 叩丁狼教育高級(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形式返回。