Mybatis是我们平时常用的ORM框架,它很灵活,在灵活的基础上,我们还可以开发一些Mybatis的插件来实现自己想要的功能。
一起来看下Mybatis插件开发的原理
预备知识
JDK的动态代理 Proxy,InvocationHandler
了解Mybatis的基本使用
分析
Mybatis的Configuration对象,存储了mybatis的配置信息,在内部多个地方都可以看到Configuration的影子,这是一个非常重要的对象,在追踪源码的时候可以看到Mybatis插件生效的地方。
image.png
通过Configration对象,我们看出可以拦截的对象有
ResultSetHandler
Executor
StatementHandler
ParameterHandler
我们看下interceptorChain.pluginAll的内容。
image.png
再看下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); } }
插件的用法,一般的使用方式为
image.png
Plugin.wrap内部实现,利用JDK的Proxy实现,参考Java使用Porxy和InvocationHandler实现动态代理
invoke方法中,内部interceptor.intercept(new Invocation(target,method,args))。可以照应开始的Interceptor的接口。
image.png
Plugin类内部实现了很多有用的工具方法,Interceptor借助Plugin来实现,其内部的方法可以多看一下。
最后
插件的内部实现,看Mybatis的源码就明白怎么回事,其余的再自己内部追踪下。
参考
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦