首先是創建一個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並返回~!