mybatis源碼解析 - 核心流程之配置解析

前言算法

在mybatis框架的整個架構中其實有一些在平時開發看來比較耗時的環節,若是在項目啓動完成後在去初始化是性能和體驗很很差的。好比:反射組件初始化、配置文件的解析和加載到內存、二級緩存模型的構建過程、日誌組件的初始化等。還好這些mybatis都爲咱們考慮到了。今天咱們就從mybatis框架的初始化開始聊聊項目啓動時配置加載的話題。spring

核心運做流程sql

image.png

我把mybatis的運做流程分爲以上三個大的階段:編程

首先是框架初始化階段,這個階段主要是mybatis-config.xml、properties、項目mapper.xml等配置文件的解析以及SqlSessionFactory的注入等;緩存

而後是代理階段,這個階段在構建整個mybatis的Mapper開發模型,動態mapper代理對象的構建和加強、編程模式的封裝和轉換;數據結構

最後纔是落地階段,進行SQL的讀寫操做,包括SQL語句的映射、參數的映射、執行器的運做、結果集的映射、賦值、包裝和最後返回等相關過程;
mybatis


今天先從第一個階段開始來剖析一下mybatis配置解析階段的相關工做。
架構

配置解析流程app

image.png

整個配置解析大致上分爲七個核心步驟,其中請重點關注settings、plugins和mappers這幾個解析階段,而mappers的解析是重中之重。整個解析詳細的過程我這邊從代碼的角度繪製了對象調用的時序圖。框架

image.png

上圖紅色和綠色字體的環節爲比較重要處理節點,你們能夠重點看一下這些點的源代碼。下面咱們就來逐一過一下

1、配置解析的入口

方式1、原生的mybatis開發,解析入口爲SqlSessionFactoryBuilder-->build()方法

image.png

方式2、若和spring結合,那解析的入口在這裏

image.png

2、Properties文件的解析

image.png

原生支持兩種方式的該文件解析來源:1.以項目resource的方式配置文件路徑;2.以url磁盤路徑的方式只是資源文件所在位置; 解析的結果以properties對象的形式存入全局配置對象Configuration

3、Settings配置詳解

image.png

咱們項目中經常使用的配置是:cacheEnabled二級緩存開關 / lazyLoadingEnabled延遲加載開關 / aggressiveLazyLoading同步加載開關 / useGeneratedKeys使用主鍵key開關 / mapUnderscoreToCamelCase自動駝峯轉換開關等。其它參數在你的項目中特定的使用場景可能須要配置都統一過一遍。

4、環境節點解析

image.png

注意:在經過applicationContext.xml方式注入,並配置數據源後。以上環境節點在mybatis-config.xml中的配置將所有被忽略!!

5、plugins插件的解析

image.png

支持多自定義攔截器插件配置和初始化,最終的結果放入全局Configuration配置對象中

6、重點:mappers節點解析

image.png

mybatis的mapper.xml的解析默認支持四種不一樣的來源方式:1. 來源於jar包;2.來源項目resource目錄;3.來源於url路徑;4.來源於指定的mapper接口;

這四種來源的文件解析順序爲:解析來源jar包--->來源resource路徑下xml--->來源本地磁盤路徑下xml---->來源指定的Mapper接口,也就是說咱們能夠同時配置,多種來源的mapper.xml;

mappers節點核心的解析過程被封裝到了XMLMapperBuilder中,它的解析流程爲:

image.png

1. 整體解析算法

image.png

在configurationElement方法中對maper.xml中的全部節點詳細進行解析,讀到的xml文件緩存到configuration的資源塊中,最後對在前面解析失敗的節點resultMap、cache-ref、curd(insert/update/delete/select)等進行補償性的再次解析(再解析失敗,則忽略異常)。

2. 解析二級緩存

image.png

image.png

這裏採用建造者模式進行二級緩存的組合建立,根據配置建立成功的緩存對象,直接放入全局配置對象

image.png

image.png

採用裝飾器模式,爲二級緩存添加各類能力。默認支持SerializedCache / LoggingCache / SynchronizedCache / PrepetureCache等這些二級緩存特性,BlockingCache能力默認是不加上的。

3. 解析resultMap

image.png

image.png

4. 解析crud(insert / update /delete /select)等節點

image.png

image.png

image.png

這裏解析sql語句的代碼封裝比較深,代碼有點繁雜,但沒有太多的技術難度。這裏就不深刻進去了。說一下重點mappers節點的每一個mapper子節點解析的結果都放入了Configuration全局對象中的mappedStatement, 它是一個Map<K,V>

key就是(namespace+命令id), Value爲MappedStatement對象。

image.png

mappedStatement中包含這些對象,這些對象和xml的一一對應關係是:

image.png


根據上面的截圖,結合你們平時的開發,你們應該對mappedStatement的數據結構應該有了一個比較直觀的瞭解了吧?下面咱們把整個配置文件解析的最重要目標成果展現一下。讓你們對configuration的骨架有一個全面直觀的認識。

image.png


總結

以上就是mybatis配置文件解析的全過程和目標成果。個人理解學習源碼更重要的是理順和掌握核心設計的流程,而不是扣某個代碼的細節。你們若是有mybatis的任何問題,歡迎在屏幕下方留言,你們一塊兒討論!下次咱們將解析mapper編程模型構建的過程,請繼續關注!

相關文章
相關標籤/搜索