Mybatis对mapper的加载流程深入讲解

 更新时间:2020年11月17日 09:15:32   作者:IT乐知  
这篇文章主要给大家介绍了关于Mybatis对mapper的加载流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

加载方法mapperElement

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

mapperElement方法源码与详解如下图:

从源码可以得出一些结论:

mappers节点支持mapper和package两种类型子节点;

package子节点只需要name一个属性;

一个mapper子节点有且只能有url、resource、class三个属性中其中一个,否则会抛出异常;

mapperElement解析两种mappers子节点,主要代码我分成了4个部分,接下来逐一进行深入解析。

解析包方法addMappers

首先来看解析包的方法使用的是configuration的addMappers方法,方法主要是涉及到一个MapperRegistry类型的属性mapperRegistry,addMappers主要流程如下图:

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简单介绍源码如下图:

解析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的加载流程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringCloud-Hystrix-Dashboard客户端服务监控的实现方法

    SpringCloud-Hystrix-Dashboard客户端服务监控的实现方法

    这篇文章主要介绍了SpringCloud-Hystrix-Dashboard客户端服务监控的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • IDEA自动补全返回值的三种快捷方式

    IDEA自动补全返回值的三种快捷方式

    平常在编码的过程中,可能需要调用第三方Api接口,这个过程中可能涉及到不太熟悉第三方Api接口的返回值类型,平常在编码的过程中,可能需要调用第三方Api接口,这个过程中可能涉及到不太熟悉第三方Api接口的返回值类型,需要的朋友可以参考下
    2023-10-10
  • Java中的List接口实现类解析

    Java中的List接口实现类解析

    这篇文章主要介绍了Java中的List接口实现类解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 使用IDEA开发配置Java Web的初始化过程

    使用IDEA开发配置Java Web的初始化过程

    该教程使用idea开发工具初始化javaweb项目,该运行在tomcat服务器上通过配置项目环境变量保证tomcat正常启动,具体操作配置教程参考下本文
    2021-06-06
  • spring mvc常用注解_动力节点Java学院整理

    spring mvc常用注解_动力节点Java学院整理

    这篇文章主要介绍了spring mvc常用注解,详细的介绍了@RequestMapping, @RequestParam, @ModelAttribute等等这样类似的注解,有兴趣的可以了解一下
    2017-08-08
  • SpringBoot调用第三方WebService接口的操作技巧(.wsdl与.asmx类型)

    SpringBoot调用第三方WebService接口的操作技巧(.wsdl与.asmx类型)

    这篇文章主要介绍了SpringBoot调第三方WebService接口的操作代码(.wsdl与.asmx类型 ),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • jdk7 中HashMap的知识点总结

    jdk7 中HashMap的知识点总结

    HashMap的原理是老生常谈了,不作仔细解说。一句话概括为HashMap是一个散列表,它存储的内容是键值对(key-value)映射。这篇文章主要总结了关于jdk7 中HashMap的知识点,需要的朋友可以参考借鉴,一起来看看吧。
    2017-01-01
  • 分享J2EE的13种核心技术

    分享J2EE的13种核心技术

    在本文中我将解释支撑J2EE的13种核心技术:JDBC, JNDI, EJBs, RMI, JSP, Java servlets, XML, JMS, Java IDL, JTS, JTA, JavaMail 和 JAF,对j2ee的13种核心技术感兴趣的朋友一起学习吧
    2015-11-11
  • Java实现超简单抖音去水印的示例详解

    Java实现超简单抖音去水印的示例详解

    抖音去水印方法很简单,以前一直没有去研究,以为搞个去水印还要用到算法去除,直到动手的时候才发现这么简单,不用编程基础都能做。所以本文将介绍一个超简单抖音视频去水印方法,需要的可以参考一下
    2022-03-03
  • 解决IDEA误删out目录下的文件导致404无法访问的问题

    解决IDEA误删out目录下的文件导致404无法访问的问题

    这篇文章主要介绍了解决IDEA误删out目录下的文件导致404无法访问的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02

最新评论