SqlSessionFactory的創建過程


首先是創建一個SqlSessionFactoryBuilder,由其名字可以看出是創建SqlSessionFactory的,跟進類中,發現它沒有構造方法,只有各種重載的build方法,返回值都是SqlSessionFactory,

看來為了創建SqlSessionFactory也是煞費苦心。。。

經過一次內部調用,來到這個build方法

此時的參數只有最開始的輸入字符流:Resources.getResourceAsReader(resource),另外兩個參數:environment和properties均為空。

在這里,XMLConfigBuilder是一個解析XML配置的類,主要作用就是解析xml配置文件並初始化一些信息。

繼續跟進XMLConfigBuilder的構造方法,發現首先是調用了重載的構造方法,並且有兩個與XML解析相關的類:

XMLMapperEntityResolver是一個實現了xml標准EntityResolver的實現類,略過

XPathParser繼續解析,跟進其構造方法,目的之一是得到一個關聯xml配置的Document對象

執行commonConstructor,主要是初始化一些配置

而下面的createDocument則產生了此Document對象,具體不贅述。

執行完畢之后,就調用了XMLConfigBuilder重載的構造方法:

可以看出這里,首先是初始化了一個全局配置類:Configuration,該類是MyBatis的總配置類,使用的地方非常多,后面會再探討。

初始化完畢之后,繼續調用父類BaseBuilder的構造方法:

主要是初始化了三個屬性:配置類,類型別名注冊類,類型處理注冊類,並且可以看出后兩個屬性均是configuration的屬性

簡要看看TypeAliasRegistry:

TypeHandlerRegistry:

都和數據類型相關的配置類。

初始化完畢之后,就得到了XMLConfigBuilder對象,此時代碼繼續回到SqlSessionFactory的build方法,

下面接着調用XMLConfigBuilder對象的parse方法:

跟進如下:
首先是xml解析類解析方法parse():

在parse方法里面,就開始解析mybatis的配置文件:

首先是得到根節點<configuration>

下面就是解析此節點,也即配置文件的內容:

查看parseConfiguration方法:

得到的根節點XNode root具體值如下:

此內容正是我的配置文件的內容。

同時在parseConfiguration方法里面也可以看到解析的順序:properties,typeAliases,plugins,。。。。

這里查看一下mapper節點的解析:

跟進mapperElement方法:

傳入的mapper節點內容如下:

解析時首先是遍歷mappers節點,然后判斷節點是否是package,如果是則獲取其name屬性並將其set到主配置類configuration的屬性MapperRegistry mapperRegistry中

該屬性主要是記錄下dao接口和其匹配的xml配置文件,以至於后續可以由sqlSession產生dao接口對應的代理實現類。

由於這里只有mapper子節點,所以繼續走,依次獲取節點的resource,url,mapperClass屬性,並且可以看到,三者屬性只能存在一種。

這里獲取到了resource節點:com/qc/dao/userDao-mapping.xml

接着初始化ErrorContext,記錄錯誤的源頭resource

然后由此resource得到對應的輸入流,用於生成XMLMapperBuilder,該類的作用是解析每個dao接口對應xml,這里就是要解析com/qc/dao/userDao-mapping.xml

調用XMLMapperBuilder的構造方法,如下:

它也是先生成XML解析類XPathParser,和之前解析Configuration一致,不贅述

生成完畢之后,調用重載構造方法:

這里也是傳入配置類,調用父類構造方法,初始化。

然后生成MapperBuilderAssistant對象,該對象在后續解析中也使用挺多。

注意XMLConfigBuilder,XMLMapperBuilder,MapperBuilderAssistant均是BaseBuilder的子類~!

得到XMLMapperBuilder對象之后,就開始解析dao對應的xml文件。

這里先不贅述,后續再研讀

配置文件都解析完畢之后,屬性都已初始化完畢,配置都已經安裝完畢,下面返回SqlSessionFactory的build方法:

可以看到,這里生成的是DefaultSqlSessionFactory並返回~!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM