mybatis plugins_[Mybatis]-[基础支持层]-插件-plugin标签解析
该系列文章针对 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 中只针对 Executor
、ParameterHandler
、ResultSetHandler
、StatementHandler
,这四种情况追加了过滤连的处理。
相关的处理方法入口为 InterceptorChain#pluginAll
,如下图
如上述代码,遍历所有的插件,调用插件本身的plugin
方法来处理,也就是Interceptor#plugin
,来看通用实现
(也可以自定义实现逻辑),代码如下
如上述代码,通用的代理逻辑交由工具类 Plugin
来实现,
接着来看一下 Plugin#wrap
方法源码
如上述源码所示,通过配对当前 interceptor 是否符合目标对象 target ,如果配对,构建相应的代理对象。
以此类推,随后实现如下图的效果:
五、总结
通过上述源码解析能够知道一个插件,也就是一个 Interceptor
的定义需要满足两个条件
1、该插件实现类实现了 Interceptor
接口
2、该插件实现类通过注解 @Intercepts
指定了该插件需要拦截的对象,也就是Executor
、ParameterHandler
、ResultSetHandler
、StatementHandler
中的一种或者多种
<plugins>
标签中配置的是一系列拦截器,这些拦截器通过代理的方式组合起来实现了过滤器链。
而这些过滤器数据存储在 InterceptorChain
中,最终数据仍然会存在 Configuration
中,
相关的 Configuration
逻辑图如下:
mybatis plugins_[Mybatis]-[基础支持层]-插件-plugin标签解析相关推荐
- sql server解析xml属性为表格_[Mybatis][基础支持层]mapper xml sql 解析
该系列文章针对 Mybatis 3.5.1 版本 Mybatis 中 标签解析,主要是为了得到两大部分数据 1.Mapper.class 接口 2.SQL 执行语句,结果集映射关系等数据 在上一章中提 ...
- idea打印sql的插件_[Mybatis]-[基础支持层]-插件-自定义简易SQL打印插件
该系列文章针对 Mybatis 3.5.1 版本 在 mybatis 中允许针对 SQL 在执行前后进行扩展操作,而这些扩展操作也叫做插件. 在 Mybaits 中允许用插件来拦截的方法包括: Exe ...
- MyBatis 架构分层与模块划分-基础支持层
最后一个就是基础支持层.基础支持层主要是一些抽取出来的通用的功能(实现复用),用来支持核心处理层的功能.比如数据源.缓存.日志.xml 解析.反射.IO.事务等等这些功能. 这个就是MyBatis 的 ...
- 2 数据源配置_[Mybatis]-[基础支持层]-数据源信息-数据源详解
该系列文章针对 Mybatis 3.5.1 版本 在上一篇文章中,谈到了 <environment> 标签解析会构建 Environment 对象,Environment 对象中有两个关键 ...
- mybatis plugins_[MyBatis] SpringBoot 整合Mybatis
现在基本上搭建一个简单的工程都是三剑客 springboot+mybatis+redis 之前整合Mybatis 都是按照SSM来,所以,这一次带来SpringBoot+MyBatis 的快速整合 p ...
- SpringBoot2.0 基础案例(10):整合Mybatis框架,集成分页助手插件
一.Mybatis框架 1.mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获 ...
- mybatis和spring jdbc持久层框架事务支持分析
mybatis和spring jdbc持久层框架事务支持分析 持久层框架中的事务支持指的是持久层框架如何支持数据库事务,我们先梳理出原生数据库事务操作的主线脉络,它是通过java.sql 包下的C ...
- Mybatis(史上最详+扩展插件工具使用)
Mybatis-9.28 环境: JDK1.8 Mysql 5.7 maven 3.6.1 IDEA 回顾: JDBC Mysql Java基础 Maven Junit SSM框架:配置文件的. 最好 ...
- IntellJ IDEA 基础之 一些常用插件plugin 简单整理 (辅助提高编写代码效率)
IntellJ IDEA 基础之 一些常用插件plugin 简单整理 (辅助提高编写代码效率) 目录 IntellJ IDEA 基础之 一些常用插件plugin 简单整理 (辅助提高编写代码效率) 一 ...
最新文章
- Python炫技操作:模块重载的五种方法
- 是啥意思_属猴人:十猴九苦是啥意思 十猴九不全什么意思 为什么
- 最大子序列求和_最大子序列和问题
- Java的组合排列问题
- python 写游戏好简单啊,我用键盘可以随意控制角色了【python 游戏实战 04】
- Linux 命令之 sed -- 功能强大的流式文本编辑器
- 《Python Cookbook 3rd》笔记(5.21):序列化 Python 对象
- 653. Two Sum IV - Input is a BST
- 编写第二个页面:新闻阅读列表页面
- Delphi-如何声明一个结构
- 1.11 Linux压缩和解压文件
- PAT 1086 Tree Traversals Again
- 几个查询优化小技巧,可以大大提高效率并解决一些问题
- Linux进阶之补充知识篇
- 【思路】2021年第十四届“认证杯“数学中国数学建模国际赛(小美赛)思路
- 时间序列之向量自回归检验VAR(自相关性)(2)
- Excel数据分析--客户对象分析
- java, Statement类的介绍
- JavaScript基础语法笔记
- 把一个运行的Docker容器做成镜像
热门文章
- Spring Boot学习总结(27)—— Spring Boot中两个数据库迁移工具Liquibase和Flyway的比较
- 消息中间件学习总结(22)——MQ 面试专题
- Docker学习总结(53)—— Docker 十个非常实用但又容易忽视的使用技巧
- 分库分表学习总结(3)——深入理解分布式事务
- Mysql学习总结(15)——Mysql错误码大全
- 河南淅川高考成绩查询2021,2021年河南高考成绩查询网址,河南高考成绩查询系统时间安排...
- 新零售大潮下 联想与BHG Mall签约共建智慧商城
- 排序算法之归并排序(JAVA)
- SQL Server 2008等登录用户只能看到自己的数据库设置办法
- NSUserDefaults 添加与删除