MyBatis允许对其四大组件(Executor,StatementHandler,ParameterHandler, ResultSetHandler)进行增强处理。在创建四大组件对象的时候

  1、每个对象创建处理都不是直接返回,而是使用拦截器链拦截处理(interceptorChain.pluginAll(四大对象))

  2、获取到所有的interceptor(可自定义或第三方提供到的接口),调用interceptor.plugin(targent),返回包装后的target对象

  那么自定义或者第三方提供的插件,是如果被MyBatists组拦截链(责任链模式)并被拦截,同时增加四大组件中要被增强的方法的?

  所有插件均需实现Interceptor接口,同时声明改interceptor对四大组件的哪个部分作用。

一、生成插件责任链

  在上文MyBatis插件的使用案例中,通过配合<plugin>标签,是插件可使用。MyBatis解析sqlMapConfig.xml的时候如上图所示生成有效的拦截器链保存在对象Configuration的InterceptorChain类中。

  跟踪源码,可知拦截器链本质插件数据列表,如下图:

  

二、拦截插件责任链

  1、生成拦截器链图中,可以了解继承了Interceptor接口的插件,在解析xml文件时setProperties就会生效。

  2、通过调试信息(如下),遇到了之前讲解Cache时熟悉的对象Executor。

  opensession执行过程中,对于Executor根据类型不同实例化后,对executor对象进行如下操作

  此为Executor的Interceptor包装,此后调用invoke方法将对组件进行包装,如下:

此方法将target(即MyBatis四大组件对象)通过拦截器链层层wrap之后返回

三、方法增强(jdk动态代理)

  测试案例中带增强的方式是prepare,跟踪至prepare的执行过程:

  即Plugin类实例作用,查看Plugin类源码可知其implements InvocationHandler。

  即执行prepare时生成代理对象,增强功能。

MyBatis功能点二:从责任链设计模式的角度理解插件实现技术的更多相关文章

  1. MyBatis功能点二:MyBatis提供的拦截器平台

    前面关于MyBatis功能点二plugin已经介绍了一些应用及其实现的底层代码,本文总结MyBatis提供的拦截器平台框架体系. 通过MyBatis功能点二:从责任链设计模式的角度理解插件实现技术 - ...

  2. Java 设计模式系列(二二)责任链模式

    Java 设计模式系列(二二)责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求 ...

  3. Java设计模式之责任链设计模式

    职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理 ...

  4. java filter过滤器及责任链设计模式

    什么是Filter? Filter属于sevlet规范,翻译为过滤器. Filter在web开发中有什么作用? 案例一:一个web站点只有用户登录才能继续访问该站点的资源,那么需要用户每次访问都判断是 ...

  5. PHP责任链设计模式

    <?php //责任链设计模式 /** * 每个对象,储存着对自己上级的引用, * 如果自己处理不了,交给上一级. */ class board{ protected $power=1; pro ...

  6. Jfinal----Handler之责任链设计模式

    Jfinal handler的处理采用了责任链设计模式 有关责任链模式,推荐看: <JAVA与模式>之责任链模式 1.实现Handler只需要继承Handler public class ...

  7. javascript实现责任链设计模式

    javascript实现责任链设计模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿这条链传递该请求,直到有一个对象处理他为止. 这是Gof的定义 ...

  8. Java中的责任链设计模式,太牛了!

    责任链设计模式的思想很简单,就是按照链的顺序执行一个个处理方法,链上的每一个任务都持有它后面那个任务的对象引用,以方便自己这段执行完成之后,调用其后面的处理逻辑. 下面是一个责任链设计模式的简单的实现 ...

  9. MyBatis功能点二应用:第三方分页插件使用

    pageHelper分⻚插件使用 在前面文章MyBatis功能点二:plugins插件使用 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中介绍了自定义插件的使用,本文介绍第三方插件pa ...

随机推荐

  1. List接口的实现类

    (一): ArrayList  构造方法 特有的方法: LinkedList 特点: 可以调用Collections类的静态方法 synchronizedCollection转换成线程安全的

  2. [未完] Linux 4.4 USB —— spiflash模拟usb大容量存储设备 调试记录 Gadget Mass Stroage

    linux 4.4 USB Gadget Mass Stroage 硬件平台: licheepi nano衍生 调试记录 驱动信息 │ This driver is a replacement for ...

  3. 【Java常用类】DateTimeFormatter

    DateTimeFormatter 方式一:预定义的标准格式 实例化 如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME DateTimeForma ...

  4. 校招——面试(Android岗)总结

    PS:持续更新,未完待续 2016.8.24某为面试 自我介绍一下 链表和数组的区别 数组的存储空间是静态.连续分布的,初始化过大会造成空间浪费,过小会使空间溢出:链表的存储空间是动态分布的,只要内存 ...

  5. 猪齿鱼 Choerodon 的数据初始化设计解析

    数智化效能平台猪齿鱼Choerodon 作为一个微服务框架,需要解决微服务数据初始化本身具有的问题和复杂性,同时也需要满足框架本身特有的数据初始化需求,下面为大家介绍一下这方面的设计思想和实现. 微服 ...

  6. JQ的使用

    1.hello,word <script type="text/javascript" src="js/jquery-1.10.1.js">< ...

  7. C#8.0 可空引用类型

    介绍 我们的项目代码运行时最频繁的错误之一就是 System.NullReferenceException 异常,c#8.0增加的可为空引用类型就是用来帮助开发者降低甚至消除NULL异常.我们需要注意 ...

  8. Go 常用函数

    #### Go 常用函数,错误处理这一节我们来学习一下Go 常用的函数,这些函数有些是内置的,有些是官方标准库内的, 熟悉这些函数对程序开发来讲还是很重要的; 1. len("abc&quo ...

  9. vue 快速入门 系列 —— 实例方法(或 property)和静态方法

    其他章节请看: vue 快速入门 系列 实例方法(或 property)和静态方法 在 Vue(自身) 项目结构 一文中,我们研究了 vue 项目自身构建过程,也知晓了 import Vue from ...

  10. 使用 Dapr 缩短软件开发周期

    Microsoft DevOps 文档里的文章(https://docs.microsoft.com/zh-cn/azure/devops/report/dashboards/cycle-time-a ...