首页 > 其他 > 详细

mybatis 插件机制

时间:2020-04-14 10:57:33      阅读:65      评论:0      收藏:0      [点我收藏+]

技术分享图片

插件

根据功能,可以将插件分为两大类:

  • 第一类:插件是对系统的一种补充,例如在分布式系统中,可以使用插件的方式,实现内存插件、磁盘插件、线性网络插件、Paxos插件等。此类插件等同于组件

  • 第二类:插件是对系统默认功能的自定义修改,例如mybatis里面自定义插件,它实现的拦截器的功能。此类插件等同于拦截器

MyBatis拦截器插件

mybatis里面自定义插件属于拦截器插件,大凡拦截器(Interceptor)都需要关注两个要点:

  1. 拦截的对象是谁,用代码行话来说,target目标是谁?
  2. 拦截的技术方案是什么?

拦截的对象

我们知道,MyBatis有四大核心对象:

  1. ParameterHandler:处理SQL的参数对象
  2. ResultSetHandler:处理SQL的返回结果集
  3. StatementHandler:数据库的处理对象,用于执行SQL语句
  4. Executor:MyBatis的执行器,用于执行增删改查操作

那么,MyBatis拦截器针对的对象就是上面“四大金刚”。

拦截的技术方案

在Java里面,我们想拦截某个对象,只需要把这个对象包装一下,用代码行话来说,就是重新生成一个代理对象。

技术分享图片

下面,我们将代理对象成为 “变身”、将原生对象称为 “原生”

也就是说,一旦配置上插件,ParameterHandler,ResultSetHandler,StatementHandler,Executor这四大核心对象,将会生成 “变身”,是一种代理对象,而不再是 “原身”。

MyBatis拦截器插件整个运行过程

没有插件的运行过程

技术分享图片

有插件的运行过程

技术分享图片

可以可以理解了吧?
一旦配置上插件,ParameterHandler,ResultSetHandler,StatementHandler,Executor这四大核心对象,将会生成 “变身”,是一种代理对象,而不再是 “原身”。

时序图

下面时序图更加清晰反映情况,

如下是时序图,在整个时序图中,涉及到mybatis插件部分已标红,基本上就是体现在上文中提到的四个类上,对这些类上的方法进行拦截。

技术分享图片

技术分享图片

运行过程详细的实现机制

实现分三步:插件配置信息的加载、代理对象的生成、拦截逻辑的执行

插件配置信息的加载

假设是基于xml配置,有如下配置

<plugins>
  <plugin interceptor="org.apache.ibatis.builder.ExamplePlugin">
    <property name="plubinProperty" value="100">
  </plugin>
</plugins>

那么通过XMLConfigBuilder解析。

  • XMLConfigBuilder首先是读取配置,读到 <plugins> 标签会进入循环。
  • 循环里面,为每一个<plugin>标签创建Interceptor对象实例 (比如上面的ExamplePlugin
  • 设置Interceptor属性变量 (比如上面的plubinProperty
  • 最后把Interceptor对象添加到InterceptorChain中
    (InterceptorChain是MyBatis提供的一个类,用来管理一堆Interceptor的)

技术分享图片

技术分享图片

代理对象的生成

Mybatis插件的实现机制主要是基于动态代理实现的,其中最为关键的就是代理对象的生成,所以有必要来了解下这些代理对象是如何生成的。

Executor代理对象

技术分享图片

拦截逻辑的执行

技术分享图片

自定义MyBatis拦截器插件

自定义拦截器定位到目标需要指明两点:

  • 拦截的对象
  • 拦截的方法(包括参数)

然后对于前面讲的三个流程实现,mybatis均提供了接口方法,让我们自定义。

  • 插件配置信息的加载
  • 代理对象的生成
  • 拦截逻辑的执行

于是,我们自定义mybatis拦截器插件,实质上就是需要把上面5个点给实现了。

拦截的对象和方法

可以拦截的对象也就那四大对象,每个对象有各自可以拦截的方法:

  • 执行器Executor(update、query、commit、rollback等方法);
  • 参数处理器ParameterHandler(getParameterObject、setParameters方法);
  • 结果集处理器ResultSetHandler(handleResultSets、handleOutputParameters等方法);
  • SQL语法构建器StatementHandler(prepare、parameterize、batch、update、query等方法);

每个方法还想需要指定对应的参数,来区分方法重载
具体每个对象有哪些方法,只需需要点到源码查找即可。
以Executor为例
技术分享图片
至于每个方法的作用,可以通过SqlSession的实现上略知一二。
如:
DefaultSqlSession 有关于 executor.queryCursor的使用和注解
技术分享图片
全面了解,则需要到网上找文章
如:
MyBatis 核心配置综述之Executor
mybatis四大接口之 Executor
(相对的,官网上找了很久,反而没找到此类介绍 ??)


参考:

https://blog.csdn.net/LawssssCat/article/details/104405760?

mybatis 插件机制

原文:https://www.cnblogs.com/lawsssscat/p/12695425.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!