该系列文章针对 Mybatis 3.5.1 版本

一、Mybatis 插件的作用

Mybatis 针对 SQL 映射语句执行过程中进行拦截处理,而对应的拦截器 Mybaits 又称之为 插件(这些插件就是Mybatis的扩展点)

在 Mybaits 中允许用插件来拦截的方法包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

通过插件的方式可以实现 SQL打印、分页等插件功能实现。

二、Mybatis 插件配置

插件代码逻辑实现后还需要加载到 Mybatis 中才能生效,Mybatis 提供了 <plugin> 配置标签,用来声明。

插件在 mybatis-config.xml 中的配置案例,如下:

通过 <plugin> 标签,然后在指定的属性 <plugin interceptor=class全路径> interceptor 配置插件实现类的全路径即可。

三、`<plugins>` 标签解析

再来回顾一下,XMLConfigBuilder解析时序简图,如下:

在时序图中<plugins>加载解析在XMLConfigBuilder#pluginElement中完成,相关解析代码如下:

如上述代码,<plugins> 的解析流程很简单

1、加载 <plugins> 下的子标签 <plugin>
2、获取 <plugin interceptor=class全路径名> 中 interceptor 属性中的 class 全路径名
3、class 必须实现了 Interceptor接口,如果满足,通过反射实例化类
4、把类加载到存放拦截器的拦截器容器,拦截器链 InterceptorChain

简单来看一下 InterceptorChain 代码定义

如上述代码所示,InterceptorChain 本身就是一个容器,用来存放所有从 <plugins> 读取到的拦截器对象。

而这里的拦截器列表,在使用过程中,会通过代理的方式,对目标对象层层代理,通过责任链的方式实现代码执行前后的层层过滤,相关逻辑图如下:

四、interceptor 过滤链代理处理代码

上面提到了 interceptor 过滤链的实现是通过代理的方式层层包裹实现的,下面来简单阅读代理流程源码

Mybatis 中只针对 ExecutorParameterHandlerResultSetHandlerStatementHandler,这四种情况追加了过滤连的处理。

相关的处理方法入口为 InterceptorChain#pluginAll,如下图

如上述代码,遍历所有的插件,调用插件本身的plugin方法来处理,也就是Interceptor#plugin,来看通用实现

(也可以自定义实现逻辑),代码如下

如上述代码,通用的代理逻辑交由工具类 Plugin 来实现,

接着来看一下 Plugin#wrap 方法源码

如上述源码所示,通过配对当前 interceptor 是否符合目标对象 target ,如果配对,构建相应的代理对象。

以此类推,随后实现如下图的效果:

五、总结

通过上述源码解析能够知道一个插件,也就是一个 Interceptor 的定义需要满足两个条件

1、该插件实现类实现了 Interceptor 接口
2、该插件实现类通过注解 @Intercepts 指定了该插件需要拦截的对象,也就是ExecutorParameterHandlerResultSetHandlerStatementHandler 中的一种或者多种

<plugins> 标签中配置的是一系列拦截器,这些拦截器通过代理的方式组合起来实现了过滤器链。

而这些过滤器数据存储在 InterceptorChain中,最终数据仍然会存在 Configuration 中,
相关的 Configuration 逻辑图如下:

mybatis plugins_[Mybatis]-[基础支持层]-插件-plugin标签解析相关推荐

  1. sql server解析xml属性为表格_[Mybatis][基础支持层]mapper xml sql 解析

    该系列文章针对 Mybatis 3.5.1 版本 Mybatis 中 标签解析,主要是为了得到两大部分数据 1.Mapper.class 接口 2.SQL 执行语句,结果集映射关系等数据 在上一章中提 ...

  2. idea打印sql的插件_[Mybatis]-[基础支持层]-插件-自定义简易SQL打印插件

    该系列文章针对 Mybatis 3.5.1 版本 在 mybatis 中允许针对 SQL 在执行前后进行扩展操作,而这些扩展操作也叫做插件. 在 Mybaits 中允许用插件来拦截的方法包括: Exe ...

  3. MyBatis 架构分层与模块划分-基础支持层

    最后一个就是基础支持层.基础支持层主要是一些抽取出来的通用的功能(实现复用),用来支持核心处理层的功能.比如数据源.缓存.日志.xml 解析.反射.IO.事务等等这些功能. 这个就是MyBatis 的 ...

  4. 2 数据源配置_[Mybatis]-[基础支持层]-数据源信息-数据源详解

    该系列文章针对 Mybatis 3.5.1 版本 在上一篇文章中,谈到了 <environment> 标签解析会构建 Environment 对象,Environment 对象中有两个关键 ...

  5. mybatis plugins_[MyBatis] SpringBoot 整合Mybatis

    现在基本上搭建一个简单的工程都是三剑客 springboot+mybatis+redis 之前整合Mybatis 都是按照SSM来,所以,这一次带来SpringBoot+MyBatis 的快速整合 p ...

  6. SpringBoot2.0 基础案例(10):整合Mybatis框架,集成分页助手插件

    一.Mybatis框架 1.mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获 ...

  7. mybatis和spring jdbc持久层框架事务支持分析

    mybatis和spring jdbc持久层框架事务支持分析 ​ 持久层框架中的事务支持指的是持久层框架如何支持数据库事务,我们先梳理出原生数据库事务操作的主线脉络,它是通过java.sql 包下的C ...

  8. Mybatis(史上最详+扩展插件工具使用)

    Mybatis-9.28 环境: JDK1.8 Mysql 5.7 maven 3.6.1 IDEA 回顾: JDBC Mysql Java基础 Maven Junit SSM框架:配置文件的. 最好 ...

  9. IntellJ IDEA 基础之 一些常用插件plugin 简单整理 (辅助提高编写代码效率)

    IntellJ IDEA 基础之 一些常用插件plugin 简单整理 (辅助提高编写代码效率) 目录 IntellJ IDEA 基础之 一些常用插件plugin 简单整理 (辅助提高编写代码效率) 一 ...

最新文章

  1. Python炫技操作:模块重载的五种方法
  2. 是啥意思_属猴人:十猴九苦是啥意思 十猴九不全什么意思 为什么
  3. 最大子序列求和_最大子序列和问题
  4. Java的组合排列问题
  5. python 写游戏好简单啊,我用键盘可以随意控制角色了【python 游戏实战 04】
  6. Linux 命令之 sed -- 功能强大的流式文本编辑器
  7. 《Python Cookbook 3rd》笔记(5.21):序列化 Python 对象
  8. 653. Two Sum IV - Input is a BST
  9. 编写第二个页面:新闻阅读列表页面
  10. Delphi-如何声明一个结构
  11. 1.11 Linux压缩和解压文件
  12. PAT 1086 Tree Traversals Again
  13. 几个查询优化小技巧,可以大大提高效率并解决一些问题
  14. Linux进阶之补充知识篇
  15. 【思路】2021年第十四届“认证杯“数学中国数学建模国际赛(小美赛)思路
  16. 时间序列之向量自回归检验VAR(自相关性)(2)
  17. Excel数据分析--客户对象分析
  18. java, Statement类的介绍
  19. JavaScript基础语法笔记
  20. 把一个运行的Docker容器做成镜像

热门文章

  1. Spring Boot学习总结(27)—— Spring Boot中两个数据库迁移工具Liquibase和Flyway的比较
  2. 消息中间件学习总结(22)——MQ 面试专题
  3. Docker学习总结(53)—— Docker 十个非常实用但又容易忽视的使用技巧
  4. 分库分表学习总结(3)——深入理解分布式事务
  5. Mysql学习总结(15)——Mysql错误码大全
  6. 河南淅川高考成绩查询2021,2021年河南高考成绩查询网址,河南高考成绩查询系统时间安排...
  7. 新零售大潮下 联想与BHG Mall签约共建智慧商城
  8. 排序算法之归并排序(JAVA)
  9. SQL Server 2008等登录用户只能看到自己的数据库设置办法
  10. NSUserDefaults 添加与删除