ITPub博客

首页 > IT职业 > IT图书 > Mybatis 插件原理

Mybatis 插件原理

IT图书 作者:winnie324 时间:2021-09-09 10:05:54 0 删除 编辑

Mybatis是我们平时常用的ORM框架,它很灵活,在灵活的基础上,我们还可以开发一些Mybatis的插件来实现自己想要的功能。

一起来看下Mybatis插件开发的原理

预备知识

  • JDK的动态代理 Proxy,InvocationHandler

  • 了解Mybatis的基本使用

分析

  1. Mybatis的Configuration对象,存储了mybatis的配置信息,在内部多个地方都可以看到Configuration的影子,这是一个非常重要的对象,在追踪源码的时候可以看到Mybatis插件生效的地方。


    图片描述

    image.png

通过Configration对象,我们看出可以拦截的对象有

  • ResultSetHandler

  • Executor

  • StatementHandler

  • ParameterHandler

  1. 我们看下interceptorChain.pluginAll的内容。


    图片描述

    image.png

  1. 再看下Interceptor接口的内容

public interface Interceptor {  // 
  Object intercept(Invocation invocation) throws Throwable;  Object plugin(Object target);  void setProperties(Properties properties);
}// 拦截器的Invocation参数,内部可以封装了target,method, args.public class Invocation {  private final Object target;  private final Method method;  private final Object[] args;  public Invocation(Object target, Method method, Object[] args) {    this.target = target;    this.method = method;    this.args = args;
  }
  ...  public Object proceed() throws InvocationTargetException, IllegalAccessException {    return method.invoke(target, args);
  }

}
  1. 插件的用法,一般的使用方式为

图片描述

image.png

  1. Plugin.wrap内部实现,利用JDK的Proxy实现,参考Java使用Porxy和InvocationHandler实现动态代理

invoke方法中,内部interceptor.intercept(new Invocation(target,method,args))。可以照应开始的Interceptor的接口。


图片描述

image.png

  1. Plugin类内部实现了很多有用的工具方法,Interceptor借助Plugin来实现,其内部的方法可以多看一下。

最后

插件的内部实现,看Mybatis的源码就明白怎么回事,其余的再自己内部追踪下。

参考

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2093/viewspace-2816274/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-16

  • 博文量
    66
  • 访问量
    414