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

作者:IT乐知 时间:2022-06-01 12:33:04 

今天来分析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只能被加载一次,重复加载会抛出异常。

来源:https://juejin.im/post/6895557869841121293

标签:mybatis,mapper,加载
0
投稿

猜你喜欢

  • Android在linux下刷机教程

    2023-09-03 17:21:04
  • 解决fcitx输入法在IDEA中输入法候选框无法跟随光标移动的问题

    2021-09-21 14:48:25
  • 关于Springboot数据库配置文件明文密码加密解密的问题

    2023-11-25 03:29:46
  • C#中WPF使用多线程调用窗体组件的方法

    2023-04-24 11:47:57
  • Android MaterialCardView的使用介绍与示例

    2023-06-23 06:31:56
  • Android自定义控件之广告条滚动效果

    2022-01-27 05:57:45
  • Java实现循环体的过滤器的方法

    2023-11-22 09:35:33
  • GSON实现Java对象的JSON序列化与反序列化的实例教程

    2023-11-23 12:39:02
  • C# 添加对System.Configuration.dll文件的引用操作

    2022-03-05 22:20:31
  • springboot 排除redis的自动配置操作

    2023-01-20 04:25:47
  • java+jsp+struts2实现发送邮件功能

    2023-08-28 18:25:27
  • java字符串的重要使用方法以及实例

    2023-11-13 23:11:51
  • 基于spring data jpa @query返回map的踩坑记录

    2023-11-27 22:51:00
  • SpringBoot如何优雅的处理全局异常

    2021-06-09 21:28:13
  • java构造函数示例(构造方法)

    2022-05-08 19:06:03
  • Spring BeanFactory和FactoryBean有哪些区别

    2023-06-25 07:42:09
  • C# Redis学习系列(二)Redis基本设置

    2022-11-16 13:23:22
  • 详解Maven settings.xml配置(指定本地仓库、阿里云镜像设置)

    2022-04-09 23:45:14
  • 浅述int与string类型转换的两种方法

    2023-09-09 08:56:28
  • C语言压缩文件和用MD5算法校验文件完整性的实例教程

    2023-04-01 05:21:49
  • asp之家 软件编程 m.aspxhome.com