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文件对应的MapperProxyFactoryMapperProxyFactory根据名字先猜测是创建mapper代理的工厂。

介绍完关键类,再来看addMappers主要分4步:

调用mapperRegistry属性的addMappers(String packageName)方法这个方法会调用另外一个addMappers;

addMappers(StringpackageName, 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只能被加载一次,重复加载会抛出异常。

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!

(0)

相关推荐

  • (四)Mybatis从入门到入土——别名、配置文件以及引入mapper

    这是mybatis系列第4篇.没看前文的建议先去[Java冢狐]公众号中查看前文,方便理解和掌握 别名 为什么需要使用别名? 在xml文件中有很多需要类完整的类名的地方,十分的冗长,为了减轻我们的工作 ...

  • 【C#】AutoMapper 使用手册

    本文基于 AutoMapper 9.0.0 AutoMapper 是一个对象-对象映射器,可以将一个对象映射到另一个对象. 官网地址:http://automapper.org/ 官方文档:https ...

  • 正则表达式学废了?xpath来救!

    使用XPathXPath,全称XML Path Language,即XML路径语言,它是在XML语言中查找信息的语言.它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索.在上一篇文章中讲 ...

  • DLL两种加载的详解

    目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称"静态库"),另一种为动态连接库(DLL,以下简称"动态库")的导入库(Imp ...

  • Mybatis中mapper相关注解解析类详解

    上一篇文章分析发现解读mapper关键是两个类MapperAnnotationBuilder和XMLMapperBuilder,今天先来看MapperAnnotationBuilder. 基础介绍 根 ...

  • Mybatis中SqlSource解析流程详解

    前面几篇文章都在详细分析mapper的加载过程,但是始终没有看到sql的解析过程,今天来详细分析下. 解析sql的位置 前面分析到不管是通过注解还是通过xml方式生成mapper,最终都是调用Mapp ...

  • 破产重整流程详解

    一.破产重整流程详解 重整申请一是重整对象的选择.需根据标的公司的股东人数.资产金额.员工人数.经营规模.经营范围.社会影响等指标来考察一个企业是否适合重整:二是明确重整的原因.不能清偿到期债务,并且 ...

  • 分布式光伏发电并网流程详解

    光伏资讯 746篇原创内容 公众号 做分布式光伏项目,并网流程是最关键的环节之一,并网申请工作贯穿着分布式光伏项目实施的全过程,并网验收更是项目结束的关键性指标. 随着光伏发电政策的不断完善,光伏并网 ...

  • 河道景观方案设计全流程详解

    城市河流最初的形式是城市边上自然的过境河,后来由于防御.运输.用水.防洪等需要,逐渐出现了护城河(壕).运河.引水河渠和排洪河道等城市河流. 到了近代,城市的快速发展导致城市河流出现了诸多问题,如严重 ...

  • 两轮与三轮电摩上牌流程·详解

    解析上牌流程之前首先需要说明一点: 符合摩托车型标准的两轮与三轮车可以正常上牌,上牌流程与燃油动力摩托车相同:反之不符合标准,以及车辆品牌不在工信部<目录>中的车辆是无法上牌的. 很多人在 ...

  • 推荐系统架构与算法流程详解

    推荐算法的理解 如果说互联网的目标就是连接一切,那么推荐系统的作用就是建立更加有效率的连接,推荐系统可以更有效率的连接用户与内容和服务,节约了大量的时间和成本.如果把推荐系统简单拆开来看,推荐系统主要 ...

  • 产品经理做APP从头到尾的所有工作流程详解!

    (一)项目启动前   从事产品的工作一年多,但自己一直苦于这样或者那样的困惑,很多人想要从事产品,或者老板自己创业要亲自承担产品一职,但他们对产品这个岗位的认识却不明晰,有的以为是纯粹的画原型,有的是 ...