简单聊聊mybatis插件(附源码)
最近给框架写了一个通用的更新表“修改人”,"修改时间","创建人","创建时间" 插件,特意了解一下mybatis插件的基本原理。
mybatis执生命周期主要由三部分部分组成:1,初始化。2,包装。3,拦截。
一,初始化插件
mybatis在启动构建SqlSessionFacotry时会从配置文件读取plugins节点信息,利用反射生成Interceptor实例,如下图代码:
构建对象成功后会添加到InterceptorChain对象下的interceptors集合里(责任链模式),interceptors是一个List集合,大家都知道List是循序的,所以多个插件在执行的时也是依据配置的插件先后顺序执行。
2,包装(修改目标对象行为)
在以下4个场景mybatis会修改调用目标对象行为(代理模式):1,创建执行器Executor 2,常见参数处理器ParameterHandler,3,创建语句处理器:StatementHandler,4,创建结果处理器:ResultSetHandler,如图:
注意图中的513行代码interceptorChain.pluginAll(executor),这里的参数executor和返回值可能不是同一个对象,如果插件集合interceptors里有匹配上否和条件的插件,则返回的对象是该插件,没有匹配上则返回当前对象本身。
如何匹配:通过反射获取插件注解@Signature值:类型,方法,参数,判断当前代理对象executor是否满足@Signature。
3,拦截
这个就好理解了,如果有插件满足拦截的户则,则返回的对象实际上是插件对象,在对象执行某个方法时实际上是执行的是插件的方法。
这个是我单独整理的mybatis插件的核心源码,非文章截图源码,该源码只包含mybatis插件核心代码。
https://gitee.com/wesley1225/mybatis-plugin-demo.git