zoukankan      html  css  js  c++  java
  • 简单聊聊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

  • 相关阅读:
    委托
    文件流
    关于.netFramework概述
    深拷贝与浅拷贝
    序列化与反序列化
    关于可空值类型
    正则表达式
    基于WF4.0的公文管理系统
    Mahout中相似度计算方法介绍
    Mahout源码目录说明
  • 原文地址:https://www.cnblogs.com/wangjun1234/p/13432053.html
Copyright © 2011-2022 走看看