
根据功能,可以将插件分为两大类:
第一类:插件是对系统的一种补充,例如在分布式系统中,可以使用插件的方式,实现内存插件、磁盘插件、线性网络插件、Paxos插件等。此类插件等同于组件。
第二类:插件是对系统默认功能的自定义修改,例如mybatis里面自定义插件,它实现的拦截器的功能。此类插件等同于拦截器。
mybatis里面自定义插件属于拦截器插件,大凡拦截器(Interceptor)都需要关注两个要点:
我们知道,MyBatis有四大核心对象:
那么,MyBatis拦截器针对的对象就是上面“四大金刚”。
在Java里面,我们想拦截某个对象,只需要把这个对象包装一下,用代码行话来说,就是重新生成一个代理对象。

下面,我们将代理对象成为 “变身”、将原生对象称为 “原生”
也就是说,一旦配置上插件,ParameterHandler,ResultSetHandler,StatementHandler,Executor这四大核心对象,将会生成 “变身”,是一种代理对象,而不再是 “原身”。
没有插件的运行过程

有插件的运行过程

可以可以理解了吧?
一旦配置上插件,ParameterHandler,ResultSetHandler,StatementHandler,Executor这四大核心对象,将会生成 “变身”,是一种代理对象,而不再是 “原身”。
时序图
下面时序图更加清晰反映情况,
如下是时序图,在整个时序图中,涉及到mybatis插件部分已标红,基本上就是体现在上文中提到的四个类上,对这些类上的方法进行拦截。


实现分三步:插件配置信息的加载、代理对象的生成、拦截逻辑的执行
假设是基于xml配置,有如下配置
<plugins>
<plugin interceptor="org.apache.ibatis.builder.ExamplePlugin">
<property name="plubinProperty" value="100">
</plugin>
</plugins>
那么通过XMLConfigBuilder解析。
<plugins> 标签会进入循环。<plugin>标签创建Interceptor对象实例 (比如上面的ExamplePlugin)plubinProperty)

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


自定义拦截器定位到目标需要指明两点:
然后对于前面讲的三个流程实现,mybatis均提供了接口方法,让我们自定义。
于是,我们自定义mybatis拦截器插件,实质上就是需要把上面5个点给实现了。
可以拦截的对象也就那四大对象,每个对象有各自可以拦截的方法:
每个方法还想需要指定对应的参数,来区分方法重载
具体每个对象有哪些方法,只需需要点到源码查找即可。
以Executor为例
至于每个方法的作用,可以通过SqlSession的实现上略知一二。
如:
DefaultSqlSession 有关于 executor.queryCursor的使用和注解
全面了解,则需要到网上找文章
如:
MyBatis 核心配置综述之Executor
mybatis四大接口之 Executor
(相对的,官网上找了很久,反而没找到此类介绍 ??)
参考:
https://blog.csdn.net/LawssssCat/article/details/104405760?
原文:https://www.cnblogs.com/lawsssscat/p/12695425.html