欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年11月17日 09:15:32   作者:IT樂知  
這篇文章主要給大家介紹了關(guān)于Mybatis對mapper的加載流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

加載方法mapperElement

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

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

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

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

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

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

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

解析包方法addMappers

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

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

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

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

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

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

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

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

解析單個mapper

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

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

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

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

總結(jié)

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

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

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

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

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

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

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

相關(guān)文章

  • SpringCloud-Hystrix-Dashboard客戶端服務(wù)監(jiān)控的實(shí)現(xiàn)方法

    SpringCloud-Hystrix-Dashboard客戶端服務(wù)監(jiān)控的實(shí)現(xiàn)方法

    這篇文章主要介紹了SpringCloud-Hystrix-Dashboard客戶端服務(wù)監(jiān)控的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • IDEA自動補(bǔ)全返回值的三種快捷方式

    IDEA自動補(bǔ)全返回值的三種快捷方式

    平常在編碼的過程中,可能需要調(diào)用第三方Api接口,這個過程中可能涉及到不太熟悉第三方Api接口的返回值類型,平常在編碼的過程中,可能需要調(diào)用第三方Api接口,這個過程中可能涉及到不太熟悉第三方Api接口的返回值類型,需要的朋友可以參考下
    2023-10-10
  • Java中的List接口實(shí)現(xiàn)類解析

    Java中的List接口實(shí)現(xiàn)類解析

    這篇文章主要介紹了Java中的List接口實(shí)現(xiàn)類解析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 使用IDEA開發(fā)配置Java Web的初始化過程

    使用IDEA開發(fā)配置Java Web的初始化過程

    該教程使用idea開發(fā)工具初始化javaweb項(xiàng)目,該運(yùn)行在tomcat服務(wù)器上通過配置項(xiàng)目環(huán)境變量保證tomcat正常啟動,具體操作配置教程參考下本文
    2021-06-06
  • spring mvc常用注解_動力節(jié)點(diǎn)Java學(xué)院整理

    spring mvc常用注解_動力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了spring mvc常用注解,詳細(xì)的介紹了@RequestMapping, @RequestParam, @ModelAttribute等等這樣類似的注解,有興趣的可以了解一下
    2017-08-08
  • SpringBoot調(diào)用第三方WebService接口的操作技巧(.wsdl與.asmx類型)

    SpringBoot調(diào)用第三方WebService接口的操作技巧(.wsdl與.asmx類型)

    這篇文章主要介紹了SpringBoot調(diào)第三方WebService接口的操作代碼(.wsdl與.asmx類型 ),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • jdk7 中HashMap的知識點(diǎn)總結(jié)

    jdk7 中HashMap的知識點(diǎn)總結(jié)

    HashMap的原理是老生常談了,不作仔細(xì)解說。一句話概括為HashMap是一個散列表,它存儲的內(nèi)容是鍵值對(key-value)映射。這篇文章主要總結(jié)了關(guān)于jdk7 中HashMap的知識點(diǎn),需要的朋友可以參考借鑒,一起來看看吧。
    2017-01-01
  • 分享J2EE的13種核心技術(shù)

    分享J2EE的13種核心技術(shù)

    在本文中我將解釋支撐J2EE的13種核心技術(shù):JDBC, JNDI, EJBs, RMI, JSP, Java servlets, XML, JMS, Java IDL, JTS, JTA, JavaMail 和 JAF,對j2ee的13種核心技術(shù)感興趣的朋友一起學(xué)習(xí)吧
    2015-11-11
  • Java實(shí)現(xiàn)超簡單抖音去水印的示例詳解

    Java實(shí)現(xiàn)超簡單抖音去水印的示例詳解

    抖音去水印方法很簡單,以前一直沒有去研究,以為搞個去水印還要用到算法去除,直到動手的時(shí)候才發(fā)現(xiàn)這么簡單,不用編程基礎(chǔ)都能做。所以本文將介紹一個超簡單抖音視頻去水印方法,需要的可以參考一下
    2022-03-03
  • 解決IDEA誤刪out目錄下的文件導(dǎo)致404無法訪問的問題

    解決IDEA誤刪out目錄下的文件導(dǎo)致404無法訪問的問題

    這篇文章主要介紹了解決IDEA誤刪out目錄下的文件導(dǎo)致404無法訪問的情況,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評論