久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

Mybatis對(duì)mapper的加載流程深入講解

瀏覽:127日期:2023-10-21 16:33:45

今天來分析Configuration初始化的最后一部分mapper的加載。​

加載方法mapperElement

XMLConfigBuilder配置Configuration的parseConfiguration方法還剩最后一行解析代碼:mapperElement(root.evalNode('mappers'));

mapperElement方法源碼與詳解如下圖:

Mybatis對(duì)mapper的加載流程深入講解

從源碼可以得出一些結(jié)論:

mappers節(jié)點(diǎn)支持mapper和package兩種類型子節(jié)點(diǎn);

package子節(jié)點(diǎn)只需要name一個(gè)屬性;

一個(gè)mapper子節(jié)點(diǎn)有且只能有url、resource、class三個(gè)屬性中其中一個(gè),否則會(huì)拋出異常;

mapperElement解析兩種mappers子節(jié)點(diǎn),主要代碼我分成了4個(gè)部分,接下來逐一進(jìn)行深入解析。

解析包方法addMappers

首先來看解析包的方法使用的是configuration的addMappers方法,方法主要是涉及到一個(gè)MapperRegistry類型的屬性mapperRegistry,addMappers主要流程如下圖:

Mybatis對(duì)mapper的加載流程深入講解

addMappers方法主要涉及到的是MapperRegistry這個(gè)類,這個(gè)類有兩個(gè)屬性:config、knownMappers。 在config指向的是configuration,knownMappers存放這class文件對(duì)應(yīng)的MapperProxyFactory 。 MapperProxyFactory根據(jù)名字先猜測是創(chuàng)建mapper代理的工廠。

介紹完關(guān)鍵類,再來看addMappers主要分4步:

調(diào)用mapperRegistry屬性的addMappers(String packageName)方法這個(gè)方法會(huì)調(diào)用另外一個(gè)addMappers;

addMappers(String packageName, Class<?> superType)方法會(huì)遍歷指定包下面所有屬于superType子類的類,上一步傳遞的是Object.class,所以這里是遍歷所有類,然后調(diào)用addMapper(mapperClass)方法;

addMapper(mapperClass)方法首先需要判斷mapperClass必須是接口, 再判斷class是否已經(jīng)存在,存在會(huì)報(bào)異常 。不存在則實(shí)例化一個(gè)MapperProxyFactory對(duì)象并put進(jìn)knownMappers,最后根據(jù)class創(chuàng)建一個(gè)MapperAnnotationBuilder并調(diào)用parse方法。

最后是MapperAnnotationBuilder的parse方法,MapperAnnotationBuilder是解析mapper注解的,我們后面詳解。

加載package下的mapper總的流程看下來比較簡單,實(shí)際上就是 找到對(duì)應(yīng)包下面所有的接口,然后根據(jù)接口創(chuàng)建一個(gè)MapperProxyFactory放到configuration屬性mapperRegistry的knownMappers中 。

解析單個(gè)mapper

從解析單個(gè)mapper有三種情況,但是分兩種情況,一種是有resource或者url屬性的是直接根據(jù)屬性值生成一個(gè)XMLMapperBuilder對(duì)象,然后執(zhí)行parse方法,如果是由class屬性值和加載包的最后一步方法相似,調(diào)用mapperRegistry的addMapper方法。

XMLMapperBuilder的初始化和parse簡單介紹源碼如下圖:

Mybatis對(duì)mapper的加載流程深入講解

解析mapper.xml的XMLMapperBuilder和最開始解析mybatis-config.xml的XMLConfigBuilder一樣都是繼承至mybatis的BaseBuilder,并且初始化流程也差不多。

可以看出XMLMapperBuilder類是解析mapper.xml最關(guān)鍵的類,這個(gè)類比較復(fù)雜,接下來的文章再來專門講解它。

總結(jié)

mapper的注入支持兩種方式,單個(gè)mapper注入或者整個(gè)包下面注入,也可以按加載class文件或者xml文件分成兩種。單個(gè)mapper注入如果是根據(jù)url或者xml則是通過加載xml文件注入,通過url獲取掃描整個(gè)包加載則是class方式進(jìn)行注入。

通過xml加載是直接根據(jù)xml生成XMLMapperBuilder,然后執(zhí)行parse方法。

通過class加載則是接口類生成MapperProxyFactory,放到MapperRegistry的map屬性knownMappers中,最后通過MapperAnnotationBuilder執(zhí)行parse進(jìn)行解析,parse也會(huì)調(diào)用XMLMapperBuilder的parse方法。

后面的文章我們先解讀MapperAnnotationBuilder這個(gè)類,最終再來看最重要的類XMLMapperBuilder。

從目前源碼可以得出一些需要注意的點(diǎn):

一個(gè)mapper子節(jié)點(diǎn)有且只能有url、resource、class三個(gè)屬性中其中一個(gè),否則會(huì)拋出異常; 一個(gè)mapper只能被加載一次,重復(fù)加載會(huì)拋出異常。

到此這篇關(guān)于Mybatis對(duì)mapper的加載流程深入講解的文章就介紹到這了,更多相關(guān)Mybatis對(duì)mapper的加載流程內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Mybatis 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 99pao成人国产永久免费视频 | 亚洲国产成人精品女人 | 在线视频自拍 | 一区二区免费视频 | 久久亚洲精品国产精品紫薇 | 国产日韩精品在线观看 | 国产成人综合一区二区三区 | 亚洲精品二区 | 色综久久 | 日韩在线视频中文字幕 | 国产精品成人一区二区三区 | 在线免费成人 | 岛国伊人 | 久久成人高清 | 欧美成人一区二区 | 久久精品国产免费 | 亚洲麻豆 | 欧美成人精品一区二区 | 久久综合狠狠综合久久综合88 | 久久综合久久久 | 天天综合视频 | 国产精品1区2区3区 午夜视频网站 | 国产91极品 | 国产精品久久久久久久久 | 国产精品一区二区三区免费 | 国产精品久久久久久av公交车 | 中文二区| 性色av一二三杏吧传媒 | 成人在线视频一区 | 午夜视频 | 人人看人人草 | 久久久精品免费观看 | 成人毛片视频网站 | 日韩毛片免费看 | 亚洲福利在线观看 | 国产精品久久久久久久电影 | av片在线观看 | 97超碰免费 | 免费在线成人 | 婷婷毛片 | 毛片链接 |