前面关于MyBatis功能点二plugin已经介绍了一些应用及其实现的底层代码,本文总结MyBatis提供的拦截器平台框架体系。

    

  通过MyBatis功能点二:从责任链设计模式的角度理解插件实现技术 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中相关源码分析可知责任链模式在拦截器平台中的应用。从上图看除了责任链模式拦截器平台还使用了jdk动态代理,因为Plugin继承了实现jdk动态代理的Invocationhandler接口。

  综合而言,Mybatis将工作单元与具体执行机制分离,弱化耦合。上图为具体工作单元,而具体执行由Mybaits提供的Executor框架进行处理。

  整个拦截器平台的流程可以理解为:

    1、解析Configuration时生成拦截器链InterceptorChain,完成工作单元的汇总;

    2、 还是在Configuration解析保存的过程中,查看Configuration提供的下列方法可知插件仅对四大组件作用:

      

      

  3、以上两步都是对工作单元功能的完善,之后就是Executor框架执行Mybatis提供的功能同时增强执行这些插件功能。

    Executor:doQuery——>Configuration:newXXXHandler——>InterceptorChain:pluginAll。

  很奇怪,多有执行过程中没有Plugin这个类的踪影,为啥?实际在pluginAll的时候就进行了Plugin类的处理。那么多拦截器,四大组件每一个拦截器都执行一遍么?当然不是,而是对应的组件使用对应的拦截器。拦截器与对应组件匹配就是通过Plugin类完成。具体看下Plugin类图,如下:

    

  一个具体的Interceptor如下:

    

  很明显signatureMap属性存储的就是当期拦截器要拦截的类和方法,具体通过getSignatureMap方法从拦截器Intercepts注解和Signature注解中获取。对剩下的就是jdk动态代理的一般流程——对满足条件的target对象进行wrap处理之后成为了plugin对象,当目标对象的目标方法被调用时直接进入plugin对象的invoke方法进行处理,否则还是原对象执行。

    


    

MyBatis功能点二:MyBatis提供的拦截器平台的更多相关文章

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

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

  2. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  3. 精尽Spring MVC源码分析 - HandlerMapping 组件(二)之 HandlerInterceptor 拦截器

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  4. MyBatis功能点二:从责任链设计模式的角度理解插件实现技术

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

  5. mybatis源码分析(5)-----拦截器的实现原理(动态代理+责任链)

    写在前面 MyBatsi 的拦截器模式是基于代理的代理模式.并且myBatis 的插件开发也是以拦截器的形式集成到myBatis 当中. MyBatis 的拦截器已经插件是在org.apache.ib ...

  6. Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7098753.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)--S ...

  7. SSM(spring mvc+spring+mybatis)学习路径——2-2、spring MVC拦截器

    目录 2-2 Spring MVC拦截器 第一章 概述 第二章 Spring mvc拦截器的实现 2-1 拦截器的工作原理 2-2 拦截器的实现 2-3 拦截器的方法介绍 2-4 多个拦截器应用 2- ...

  8. mybatis深入理解(二)-----Mybatis数据源与连接池

    对于ORM框架而言,数据源的组织是一个非常重要的一部分,这直接影响到框架的性能问题.本文将通过对MyBatis框架的数据源结构进行详尽的分析,并且深入解析MyBatis的连接池.本文首先会讲述MyBa ...

  9. myBatis学习笔记(10)——使用拦截器实现分页查询

    1. Page package com.sm.model; import java.util.List; public class Page<T> { public static fina ...

随机推荐

  1. Android过时方法替代

    managedQuery替换为cursorLoader example: uri = data.getData(); String[] proj = {MediaStore.Images.Media. ...

  2. C# 基本控件使用练习

    自己设计并编写一个 Windows 应用程序,要求用到 TextBox.GroupBox.RadioButton.CheckBox.ComboBox.ListBox 控件. 代码如下: 页面1: us ...

  3. 热词cloud-EChart安装

    1.安装npm install echarts npm install echarts-wordcloud注意版本:echarts版本5只能和wordcloud版本2的一起使用 :echarts版本4 ...

  4. Book of the Dead 死者之书Demo工程回顾与学习

    1.前言 一转眼离Book of the Dead Environment Demo开放下载已过去多年,当时因为技术力有限,以及对HDRP理解尚浅, 所以这篇文章一直搁浅到了现在.如今工作重心已转向U ...

  5. C++与lua交互之C++访问lua

    假设lua中: name="gzw" id=17010805 sex=man tab={ num=100, str="hello" } foo_one=func ...

  6. Python实现查询12306火车票信息

    例子来源于马哥的公众号,看了几遍,有些地方存在些疑问,然后就自己查找些资料,重写的一下,但是对于获取到的信息,并不能有效的解析出来,而且对于中文字符处理,并不是很好,请大神指教下!谢过! 1.接口设置 ...

  7. 用Json给表单赋值

    $.extend({ setForm :function(frm,jsonValue) { var obj=$(frm); $.each(jsonValue, function (name, ival ...

  8. 关于diffing算法中key的使用

    在vue和react中(只学了这两个),经常需要渲染元素到DOM上,而且如果不写key,有的浏览器会进行报错或者进行提示. 在我的理解里:key其实就是一个身份的标识,证明这个位置坐的就是这个人.后期 ...

  9. Android Adapter基本理解

    感谢大佬:https://blog.csdn.net/l799069596/article/details/47301711 Android Adapter基本理解: 我的理解是: 1.一个有许多ge ...

  10. CentOS 7中的系统语言包及UTF-8、en_US.UTF-8和zh_CN.UTF-8的区别

    UTF-8.en_US.UTF-8和zh_CN.UTF-8的区别 en_US.UTF-8.zh_CN.UTF-8叫做字符集,就是说'A'.'B'.'中'.'国'等对应的整数值,en_US.UTF-8只 ...