Mybatis 插件原理

作者: Real_man | 来源:发表于2018-08-29 23:03 被阅读17次

    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的源码就明白怎么回事,其余的再自己内部追踪下。

    参考

    相关文章

      网友评论

        本文标题:Mybatis 插件原理

        本文链接:https://www.haomeiwen.com/subject/ufelwftx.html