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. 两张Number()函数图和Boolean()函数图

  2. SSRF漏洞用到的其他协议(dict协议,file协议)

    0x00 引言 当SSRF打内网reids时,若gopher协议用不了,我们也可以用其他协议 0x01 dict协议一.定义:词典网络协议,在RFC 2009中进行描述.它的目标是超越Webster ...

  3. Golang 基准测试Benchmark

    基准测试 Go语言标准库内置的 testing 测试框架提供了基准测试(benchmark)的能力,实现了对某个特定目标场景的某项性能指标进行定量的和可对比的测试. 基本规则 基准测试的代码文件必须以 ...

  4. Linux - 文件处理

    链接服务器 ssh 使用ssh:ssh -p22 username@host(服务器地址) 输入后会提示输入密码 -p22是ssh默认端口 可以不用 登录之后会默认处于 home 路径 xshell ...

  5. Android学习笔记4

    activity配置文件 //AndroidMainifest.xml <?xml version="1.0" encoding="utf-8"?> ...

  6. Java 异步 I/O

    Java 中的异步 I/O 简称 AIO, A 即 Asynchronous.AIO 在 JDK1.7 时引入,基于操作系统提供的异步 I/O 通信模型,封装了一些进行异步 I/O 操作的 API. ...

  7. 返回值Student处理过程

  8. linux信号 SIGINT SIGTERM SIGKILL

    三者都是结束/终止进程运行. 1.SIGINT SIGTERM区别 前者与字符ctrl+c关联,后者没有任何控制字符关联. 前者只能结束前台进程,后者则不是. 2.SIGTERM SIGKILL的区别 ...

  9. Nginx命令(全局配置文件与模块)

    目录 一:Nginx命令 二:Nginx全局配置文件 1.nginx全局配置 2.过滤出Nginx 三:Nginx网址模块(解析) 一:Nginx命令 1.-v : 打印版本号 [root@web01 ...

  10. C++ 构造函数、析构函数与虚函数的关系

    编译环境:windows 10 + VS2105 1.构造函数不能为虚函数 虚函数的作用是为了实现C++多态机制.基类定义虚函数,子类可以重写该虚函数.当子类重写父类虚函数后,父类指针指向子类地址时, ...