热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

这篇文章主要给大家介绍了关于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<&#63;> 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的加载流程内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文探讨了在 ASP.NET MVC 5 中实现松耦合组件的方法。通过分离关注点,应用程序的各个组件可以更加独立且易于维护和测试。文中详细介绍了依赖项注入(DI)及其在实现松耦合中的作用。 ... [详细]
  • 网易严选Java开发面试:MySQL索引深度解析
    本文详细记录了网易严选Java开发岗位的面试经验,特别针对MySQL索引相关的技术问题进行了深入探讨。通过本文,读者可以了解面试官常问的索引问题及其背后的原理。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 深入理解 .NET 中的中间件
    中间件是插入到应用程序请求处理管道中的组件,用于处理传入的HTTP请求和响应。它在ASP.NET Core中扮演着至关重要的角色,能够灵活地扩展和自定义应用程序的行为。 ... [详细]
  • 本文介绍如何在Spring Boot项目中集成Redis,并通过具体案例展示其配置和使用方法。包括添加依赖、配置连接信息、自定义序列化方式以及实现仓储接口。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • 本文介绍如何在Vue项目中配置Webpack,使JS代码作为入口文件直接嵌入到HTML中,而不是传统的HTML作为入口。 ... [详细]
  • 配置PHPStudy环境并使用DVWA进行Web安全测试
    本文详细介绍了如何在PHPStudy环境下配置DVWA( Damn Vulnerable Web Application ),并利用该平台进行SQL注入和XSS攻击的练习。通过此过程,读者可以熟悉常见的Web漏洞及其利用方法。 ... [详细]
author-avatar
PearlLisa530
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有