MyBatis功能点二:从责任链设计模式的角度理解插件实现技术
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功能点二:从责任链设计模式的角度理解插件实现技术的更多相关文章
- MyBatis功能点二:MyBatis提供的拦截器平台
前面关于MyBatis功能点二plugin已经介绍了一些应用及其实现的底层代码,本文总结MyBatis提供的拦截器平台框架体系. 通过MyBatis功能点二:从责任链设计模式的角度理解插件实现技术 - ...
- Java 设计模式系列(二二)责任链模式
Java 设计模式系列(二二)责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求 ...
- Java设计模式之责任链设计模式
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理 ...
- java filter过滤器及责任链设计模式
什么是Filter? Filter属于sevlet规范,翻译为过滤器. Filter在web开发中有什么作用? 案例一:一个web站点只有用户登录才能继续访问该站点的资源,那么需要用户每次访问都判断是 ...
- PHP责任链设计模式
<?php //责任链设计模式 /** * 每个对象,储存着对自己上级的引用, * 如果自己处理不了,交给上一级. */ class board{ protected $power=1; pro ...
- Jfinal----Handler之责任链设计模式
Jfinal handler的处理采用了责任链设计模式 有关责任链模式,推荐看: <JAVA与模式>之责任链模式 1.实现Handler只需要继承Handler public class ...
- javascript实现责任链设计模式
javascript实现责任链设计模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿这条链传递该请求,直到有一个对象处理他为止. 这是Gof的定义 ...
- Java中的责任链设计模式,太牛了!
责任链设计模式的思想很简单,就是按照链的顺序执行一个个处理方法,链上的每一个任务都持有它后面那个任务的对象引用,以方便自己这段执行完成之后,调用其后面的处理逻辑. 下面是一个责任链设计模式的简单的实现 ...
- MyBatis功能点二应用:第三方分页插件使用
pageHelper分⻚插件使用 在前面文章MyBatis功能点二:plugins插件使用 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中介绍了自定义插件的使用,本文介绍第三方插件pa ...
随机推荐
- 2018HPU暑期集训第四次积分训练赛 K - 方框 题解(图形打印)
思路分析:题目已经明确透露了这道题的解法:就是画框.当 输入的边长 的话,就表示可以在内层继续嵌套一个方框.废话就不多说了,直接上代码吧! 代码如下: #include <iostream&g ...
- Visaul Studio 2015 MFC 应用程序工程创建
近一段时间开始接触到MFC桌面开发程序,忙完了一段时间的项目开发之后,来整理整理Visaul Studio 2015开发MFC桌面程序的基本功能. 首先从创建软件工程项目开始,Visaul Studi ...
- Java传递变量和对象的区别
传递对象 public class Demo03 { //引用传递:(实际上还是值传递)对于引用数据类型来说,传递的则是地址的副本(对象的地址).但由于地址副本和原来的类似,因此传递过去后形参也只想同 ...
- C# 文件对话框例子
OpenFileDialog控件的基本属性InitialDirectory:对话框的初始目录 Filter: 获取或设置当前文件名筛选器字符串,例如,"文本文件(*.txt)|*.txt|所 ...
- csapp lab2 拆炸弹
1. 实验内容 包含一个二进制应用bomb,需要根据该应用猜测程序的运行过程.程序主体包含了六个函数phase_1到phase_6,每个函数会根据用户的输入做出反应,当输入符合要求时,会炸弹拆解成功, ...
- 数据库查询语句遇到:Unknown column 'XXXX' in 'where clause'解决方法
数据库查询语句遇到:Unknown colunm 'XXX' in 'where clause'解决方法 根本原因:可能是sql语句所用到的数据类型错误(int与String)弄错- 我的情况: 在网 ...
- Linux查看CPU历史负载
sar -f /var/log/sa/sa20 -s 02:00:00 -e 06:00:00 | head -n 50 sysstat工具与负载历史回放 很多系统负载过高的时候我们是无法立即获知或者 ...
- django之djangorestframework序列化操作
只介绍序列化操作:serializers.ModelSerializer 与 serializers.Serializer 使用序列化的目的:将数据序列化成 JSON 对象 当页面上需要动态加载内容 ...
- Spring @SessionAttributes注解 @ModelAttribute注解
一.@SessionAttribute详解 如果多个请求之间需要共享数据,就可以使用@SessionAttribute. 配置的方法: 在控制器类上标注@SessionAttribute. 配置需要共 ...
- 微前端框架 之 qiankun 从入门到源码分析
封面 简介 从 single-spa 的缺陷讲起 -> qiankun 是如何从框架层面解决 single-spa 存在的问题 -> qiankun 源码解读,带你全方位刨析 qianku ...