Mybatis源码分析之插件模块

 更新时间:2021年06月16日 14:22:23   作者:IT_小白鼠  
今天给大家带来的是关于Mybatis的相关知识,文章围绕着Mybatis插件模块展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下

Mybatis插件模块

插件这个东西一般用的比较少,就算用的多的插件也算是PageHelper分页插件;

PageHelper官网:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md

官网上这个也有谈到Mybatis的插件流程分析。

使用示例

插件类

记录SQL执行的时间,

1、在JDK8之前必须实现Interceptor接口中的三个方法,在JDK8之后只需要实现intercept方法即可;

2、加上@Intercepts注解,并且附加上需拦截的类型以及方法@Signature:

type:插入的类,即指定的四个类型;

method:拦截插入类的方法;

args:拦截插入类方法的参数类型,按顺序。

3、实现的plugin方法,必须执行Plugin.wrap(target, this);JDK8之后在接口中写了默认方法。

@Intercepts({
	@Signature(type = StatementHandler.class, method = "query", args = { Statement.class, ResultHandler.class })
})
public class ThresHolderPlugin implements Interceptor {
 
	int threshold = 0;
	
	public Object intercept(Invocation invocation) throws Throwable {
		long start = System.currentTimeMillis();
		Object proceed = invocation.proceed();
		long end = System.currentTimeMillis();
		
		System.out.println("select time: " + (end-start) + "ms");
		
		return proceed;
	}
 
	public Object plugin(Object target) {
		return Plugin.wrap(target, this);
	}
 
	public void setProperties(Properties properties) {
		this.threshold = Integer.valueOf(properties.getProperty("value"));
		System.out.println("threshold :" + threshold);
	}
 
}

配置文件

<plugins>
		<plugin interceptor="com.test.mybatis.MybatisTest.official.plugin.ThresHolderPlugin">
            //数据会传输到插件类的Properties
			<property name="value" value="10"></property>
		</plugin>
	</plugins>

设计模式

责任链模式(Chain of Responsibility Pattern)

为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

责任链模式优点:

降低耦合度。它将请求的发送者和接收者解耦。

简化了对象。使得对象不需要知道链的结构。

增强给对象指派职责的灵活性。通过改变链内 的成员或者调动它们的次序,允许动态地新增 或者删除责任。

增加新的请求处理类很方便。

UML:

Handler:定义了一个处理请求的标准接口;

ConcreteHandler:具体的处理者,处理它负 责的部分,根据业务可以结束处理流程,也可 以将请求转发给它的后继者;

client :发送者,发起请求的客户端;

源码分析

在之前谈到Mybatis的核心流程分析中在加载Mybatis的配置文件的时候会把所有的插件加载带Configuration对象中的InterceptorChain变量当中,

如果有多个插件类的话,因为InterceptorChain类储存插件类是有序集合,所以执行插件的顺序就是在xml配置插件的顺序;

在Configuration类中:

这里有个CacheExecutor执行器,当开启了二级缓存的时候,就是选用缓存执行器,使用是装饰器模式将真正的执行器包装了一层。

我们现在看一下这个pluginAll方法:

使用动态代理将真正的对象进行增强;

在之前那个方法中,必须执行Invocation的proceed()方法,这个方法就是执行method.invoke()方法;

如果有多个插件的话,那么就会出现重复代理对象,那么重复代理对象的执行的话,执行过程如下:

这就是责任链模式,一层嵌套着一层。

在配置XML文件中配置:

<plugins>
	<plugin interceptor="com.test.mybatis.MybatisTest.official.plugin.ThresHolderPlugin">
		<property name="value" value="10"></property>
	</plugin>
	<plugin interceptor="com.test.mybatis.MybatisTest.official.plugin.ThresHolderPlugin2">
		<property name="value" value="20"></property>
	</plugin>
</plugins>

那么执行的过程就是:

ThresHolderPlugin2{

     ThresHolderPlugin{

           interceptor.intercept(new Invocation(target, method, args))

     }

到此这篇关于Mybatis源码分析之插件模块的文章就介绍到这了,更多相关Mybatis插件模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java开源调度如何给xxljob加k8s执行器

    java开源调度如何给xxljob加k8s执行器

    这篇文章主要介绍了java开源调度如何给xxljob加一个k8s执行器, xxljob 在设计上,抽象出了执行器的接口,所以实现一个语言的执行器并不复杂,这里主要探索下,如何利用k8s的pod 的能力,使用 xxljob 调度 pod 运行,实现一个通用的和语言无关的执行器
    2022-02-02
  • 解读@RabbitListener起作用的原理

    解读@RabbitListener起作用的原理

    这篇文章主要介绍了解读@RabbitListener起作用的原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 详解Spring 参数验证@Validated和@Valid的区别

    详解Spring 参数验证@Validated和@Valid的区别

    这篇文章主要介绍了详解参数验证 @Validated 和 @Valid 的区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Maven打包jar生成javadoc文件和source文件代码实例

    Maven打包jar生成javadoc文件和source文件代码实例

    这篇文章主要介绍了Maven打包jar生成javadoc文件和source文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java synchronized同步方法详解

    Java synchronized同步方法详解

    这篇文章主要为大家详细介绍了Java synchronized同步方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • JAVA简单实现MD5注册登录加密实例代码

    JAVA简单实现MD5注册登录加密实例代码

    本篇文章主要介绍了JAVA简单实现MD5注册登录加密实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Spring boot集成Go-FastDFS实现图片上传删除等功能实现

    Spring boot集成Go-FastDFS实现图片上传删除等功能实现

    这篇文章主要介绍了Spring boot集成Go-FastDFS实现图片上传删除等功能实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Java通过值查找对应的枚举的实现

    Java通过值查找对应的枚举的实现

    本文主要介绍了Java通过值查找对应的枚举的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • IntelliJ IDEA创建maven多模块项目(图文教程)

    IntelliJ IDEA创建maven多模块项目(图文教程)

    这篇文章主要介绍了IntelliJ IDEA创建maven多模块项目(图文教程),非常具有实用价值,需要的朋友可以参考下
    2017-09-09
  • 如何解决@NotBlank不生效的问题

    如何解决@NotBlank不生效的问题

    这篇文章主要介绍了如何解决@NotBlank不生效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论