近期準(zhǔn)備做一下Mybatis的源碼解讀徒坡,整個(gè)系列大概會(huì)有6-7篇文章喇完。
先釋放一下目錄:
1.Mybatis框架組件設(shè)計(jì)&頂層接口
2.Mybatis框架啟動(dòng)流程分析
3.Mybatis框架源碼Configuration分析
4.Mybatis框架一條插入語句的執(zhí)行流程
5.Mybatis框架從源碼角度來講執(zhí)行增,刪,改的時(shí)候如何保證線程安全?
6.Mybatis框架一條查詢語句的執(zhí)行流程
7.Mybatis的日志&異常體系
8.Mybatis與Spring集成過程
9.Mybatis的CRUD代碼生成
寫這篇文章的目的一方面是面試問的頻率比較高,也比較難则涯。另一方面也是對Mybatis的啟動(dòng)流程比較感興趣,希望知道啟動(dòng)過程中的不同階段做了什么事浮入,如何組織數(shù)據(jù)結(jié)構(gòu)事秀。
這里我閱讀的是Mybatis3的一些源碼,同時(shí)會(huì)通過test目錄里的test-case做一些debug睹欲。閱讀源碼的效率,理解源碼內(nèi)容上會(huì)好很多闸衫。
先放一張流程圖說明Mybatis啟動(dòng)過程:
Mybatis的啟動(dòng)過程有兩條線,一條明線稀余,一條暗線:
明線:簡單看Mybatis的啟動(dòng)過程是在通過一些工廠創(chuàng)建SqlSession對象,解析配置文件掸掏。
暗線:實(shí)際上是在初始化Configuration.看源碼可以知道Configuration在很多地方都被依賴了。但是呢卻不怎么了解Configuration在Mybatis中的定位愿待。這個(gè)會(huì)在第三篇文章中專門對Configuration類做解析介紹。
下面我們通過debug看一下Mybatis的整體啟動(dòng)初始化過程。
我們重點(diǎn)跟蹤一下Mybatis源碼中的test case中的:org.apache.ibatis.session.SqlSessionManagerTest#setup()方法
先以debug方式啟動(dòng):org.apache.ibatis.session.SqlSessionManagerTest#shouldCommitInsertedAuthor()方法
這里有個(gè)隱含的問題就是說是初始化Configuration對象囱挑,但是從哪初始化的呢游添,從哪去解析的呢?可以看一下XMLConfigBuilder的構(gòu)造方法和其父類的構(gòu)造方法,如下圖:
上面幾步我們已經(jīng)創(chuàng)建了Configuration對象嗡贺,并且一些屬性有了默認(rèn)值煞茫,如下圖:
下面我們繼續(xù)debug,看org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration()方法
這個(gè)方法執(zhí)行結(jié)束整個(gè)初始化Configuration對象的過程也就結(jié)束了,后面會(huì)通過這個(gè)初始化好的Configuration再創(chuàng)建SqlSessionManager,SqlSessionFactory對象等客情。
我們繼續(xù)跟其中一個(gè)方法如:org.apache.ibatis.builder.xml.XMLConfigBuilder#mapperElement
這里繼續(xù)深入一些看這個(gè)方法:org.apache.ibatis.builder.xml.XMLMapperBuilder#parameterMapElement()
解析xxDAOMapper.xml的過程比較隱蔽,因?yàn)槭侵饘咏馕龅模虼瞬粫?huì)明顯的去解析某文件夾下的某xml文件项鬼。解析過程的起點(diǎn)是mybatis的配置文件mapperconfig.xml.
整個(gè)解析過程結(jié)束后我們簡單看一下sqlSessionManager的創(chuàng)建過程。
到這里我們通過debug的方式將整個(gè)mybatis的啟動(dòng)過程梳理了一遍沦零,由于初始化過程涉及到很多具體的處理細(xì)節(jié)疾渴,這里不再展開,讀者可以將mybatis的代碼down下來屯仗,本地直接跑test-case,然后debug具體看某一方面的實(shí)現(xiàn)細(xì)節(jié)搞坝,相信一定能收獲很多。