国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Mybatis對mapper的加載流程深入講解

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

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

加載方法mapperElement

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

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

Mybatis對mapper的加載流程深入講解

從源碼可以得出一些結論:

mappers節點支持mapper和package兩種類型子節點;

package子節點只需要name一個屬性;

一個mapper子節點有且只能有url、resource、class三個屬性中其中一個,否則會拋出異常;

mapperElement解析兩種mappers子節點,主要代碼我分成了4個部分,接下來逐一進行深入解析。

解析包方法addMappers

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

Mybatis對mapper的加載流程深入講解

addMappers方法主要涉及到的是MapperRegistry這個類,這個類有兩個屬性:config、knownMappers。 在config指向的是configuration,knownMappers存放這class文件對應的MapperProxyFactory 。 MapperProxyFactory根據名字先猜測是創建mapper代理的工廠。

介紹完關鍵類,再來看addMappers主要分4步:

調用mapperRegistry屬性的addMappers(String packageName)方法這個方法會調用另外一個addMappers;

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

addMapper(mapperClass)方法首先需要判斷mapperClass必須是接口, 再判斷class是否已經存在,存在會報異常 。不存在則實例化一個MapperProxyFactory對象并put進knownMappers,最后根據class創建一個MapperAnnotationBuilder并調用parse方法。

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

加載package下的mapper總的流程看下來比較簡單,實際上就是 找到對應包下面所有的接口,然后根據接口創建一個MapperProxyFactory放到configuration屬性mapperRegistry的knownMappers中 。

解析單個mapper

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

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

Mybatis對mapper的加載流程深入講解

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

可以看出XMLMapperBuilder類是解析mapper.xml最關鍵的類,這個類比較復雜,接下來的文章再來專門講解它。

總結

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

通過xml加載是直接根據xml生成XMLMapperBuilder,然后執行parse方法。

通過class加載則是接口類生成MapperProxyFactory,放到MapperRegistry的map屬性knownMappers中,最后通過MapperAnnotationBuilder執行parse進行解析,parse也會調用XMLMapperBuilder的parse方法。

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

從目前源碼可以得出一些需要注意的點:

一個mapper子節點有且只能有url、resource、class三個屬性中其中一個,否則會拋出異常; 一個mapper只能被加載一次,重復加載會拋出異常。

到此這篇關于Mybatis對mapper的加載流程深入講解的文章就介紹到這了,更多相關Mybatis對mapper的加載流程內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
主站蜘蛛池模板: 欧美成人免费观看bbb | 亚洲精品国产综合一线久久 | 国产亚洲精品成人婷婷久久小说 | 精品欧美成人高清在线观看2021 | 毛片在线高清免费观看 | 日韩永久在线观看免费视频 | 美女视频网站永久免费观看软件 | 美女视频永久黄网站在线观看 | 一级一级毛片免费播放 | 国产一区二区在线视频播放 | 俄罗斯黄色一级片 | 美女视频一区二区三区在线 | 久久成人免费视频 | 国产在线视频一区二区三区 | 国产精品久久久久久一级毛片 | 日本亚洲欧美在线 | 国产乱淫视频 | 亚洲美女综合网 | 又黄又湿又爽吸乳视频 | 天天澡天天碰天天狠伊人五月 | 97视频在线观看免费播放 | 黄色网址进入 | 欧美日韩亚洲国内综合网俺 | 欧美一级高清片免费一级 | 亚洲男人的天堂网 | 热re66久久精品国产99热 | 亚洲情a成黄在线观看 | 97超级碰碰碰免费公开在线观看 | 伊人资源 | 波多野结衣在线免费观看视频 | 欧美成人a大片 | 日韩精品特黄毛片免费看 | 久cao在线观看视频 久爱免费观看在线网站 | 亚洲欧美视频在线观看 | 996久久国产精品线观看 | 日韩黄色一级片 | 国产一区日韩二区欧美三 | 欧美三级一区 | 亚洲精品久久久久久久777 | 欧美日韩一级二级三级 | 亚洲天堂网视频 |