单个插件的拦截原理

 1.mybatis的Invocationhandler是 Plugin类2.interceptor接口里面有三个方法1.plugin():根据@signature创建代理类对象,没有被标识的四大对象,直接返回,不返回代理对象Plugin.wrap(target,interceptot)这是Mybatis提供的简化操作,底层也是调用Proxy.newProxyInstance创建代理对象2.serProperties():可以给interceptor设置一些properties,在全局配置文件注册plugin的时候,可以设置3.重点:intercept()这是最后执行aop目标方法的地方里面调用invocation.proceed()执行目标方法,在前后可以完成aop但是这并不是invocationHandler的invoke方法,invoke方法会执行interceptor的intercept方法,进入这个方法最终执行3.在 interceptor实现类上有一个注解,@Intercept({@Signature(type = 拦截哪个四大对象,method  = 四大对象的哪个方法,args=)})4.在全局配置文件中注册 intercept插件

单个插件的拦截原理(具体执行过程)

 1.四大对象在创建时,就执行了interceptor的plugin方法,创建出了代理类对象(当然,plugin方法里面创建代理类对象的具体实现,要我们手动填写)2.有了代理对象,那么proxy在执行方法时,就会进入 invocationHandler的 invoke方法so,mybatis的InvocationHandler是谁?是Plugin类(Mybatis包下的一个类)3.Plugin类的invoke方法,会调用 interceptor的 intercept方法this is why 最终执行目标方法aop,在interceptor的intercept方法里面

多个插件的原理(拦截器链)

 1.按顺序注册插件2.按顺序,四大对象创建后,都会调用 interceptorChains 中的 interceptor去调用它的,plugin方法,去生成代理对象(根据 signature)3.原理是,第一个 interceptor 生成的 proxy,会直接作为 target 返回给 下一个interceptor,去调用 plugin方法,生成下一个代理对象so,最终的 proxy,是按注册顺序一层一层包装的 proxy,proxy里面的 需要被代理的对象的类型就是proxy4.proxy生成后,执行invoke,里面的 interceptor.intercept(invocation)的时候是,会调用invocation.proceed(),这个就是proxy里面的真正的对象去执行它的方法,但是这个真正的对象,也是proxy,就会重复上面这个操作所以,proxy最后执行的时候,是按注册的反顺序执行的 intercept()方法,最后只剩下 真正对象了,才会执行真正对象的目标方法5.结论:生成代理对象是按注册顺序,执行目标方法是按 相反的 注册顺序

拦截器底层就是aop和责任链模式,那么是aop,就要有代理对象,和invocationHandler,另外拦截器必须得有 标识(拦截哪些对象的哪些方法)

2.责任链模式:事件对象(四大对象),责任链(interceptorChain,里面组织处理器的顺序的用的list实现的),四大对象被创建后,传给责任链,责任链的每个处理器按顺序调用handler(事件对象)方法,针对mybatis是如何实现这个handler方法的,mybatis是里面的interceptor,的plugin方法,其主要目的生成代理对象,因为拦截器后面用的就是动态代理模式,但是这个跟 责任链模式无关。ok,那么处理器的处理条件是什么?就是interceptor的@signature(哪个对象,方法),当四大对象进来interceptor的plugin方法后,判断这个对象的这个方法是否存在,存在那么,给这个对象的(这个接口方法)生成对应的 proxy,如果没有,那么处理器将这个事件对象传给下一个处理器处理

3.拦截器如果不注册,那么mybatis源码中的走interceptorchain,不会处理事件对象,返回的还是原 事件对象

4.当处理器链执行完,返回了对应的proxy,当proxy在执行方法的时候,就会进入invocationHandler的invoke方法,这里就是动态代理,前面处理 事件对象的过程是责任链模式,但是invoke方法不会直接执行具体的动态代理增强,它会 将proxy的内容,封装成一个invocation,传给当前的interceptor的intercept(invocation)方法,在这个方法里面做增强

Mybatis插件原理相关推荐

  1. mybatis 插件原理

    [传送门]:mybatis 插件原理 转载于:https://www.cnblogs.com/virgosnail/p/10079838.html

  2. MyBatis(四)MyBatis插件原理

    MyBatis插件原理 MyBatis对开发者非常友好,它通过提供插件机制,让我们可以根据自己的需要去增强MyBatis的功能.其底层是使用了代理模式+责任链模式 MyBatis官方https://m ...

  3. 后端技术:mybatis插件原理详解

    关注"Java后端技术全栈" 回复"面试"获取全套面试资料 上次发文说到了如何集成分页插件MyBatis插件原理分析,看完感觉自己better了,今天我们接着来 ...

  4. MyBatis 插件原理与自定义插件-猜想

    MyBatis 的插件可以在不修改原来的代码的情况下,通过拦截的方式,改变四大核心对象的行为,比如处理参数,处理SQL,处理结果. 第一个问题: 不修改对象的代码,怎么对对象的行为进行修改,比如说在原 ...

  5. MyBatis插件原理解析及自定义插件实践

    一.插件原理解析 首先,要搞清楚插件的作用.不管是我们自定义插件,还是用其他人开发好的第三方插件,插件都是对MyBatis的四大核心组件:Executor,StatementHandler,Param ...

  6. MyBatis 插件原理与自定义插件

    MyBatis 通过提供插件机制,让我们可以根据自己的需要去增强MyBatis 的功能. 需要注意的是,如果没有完全理解MyBatis 的运行原理和插件的工作方式,最好不要使用插件,因为它会改变系底层 ...

  7. MyBatis 插件原理与自定义插件-插件编写与注册

    (基于spring-mybatis)运行自定义的插件,需要3 步,我们以PageHelper 为 1.编写自己的插件类 1)实现Interceptor 接口 这个是所有的插件必须实现的接口. 2)添加 ...

  8. MyBatis 插件原理与自定义插件-用代理模式我们就要解决几个问题

    1) 有哪些对象允许被代理?有哪些方法可以被拦截? 我们应该了解MyBatis 允许哪些对象的哪些方法允许被拦截,并不是每一个运行的节点都是可以被修改的.只有清楚了这些对象的方法的作用,当我们自己编写 ...

  9. MyBatis 插件原理与自定义插件-代理和拦截是怎么实现的?

    问题1:四大对象什么时候被代理,也就是:代理对象是什么时候创建的? 问题2:多个插件的情况下,代理能不能被代理?代理顺序和调用顺序的关系? 问题3:谁来创建代理对象? 问题4:被代理后,调用的是什么方 ...

  10. MyBatis 插件原理与自定义插件-需求实现

    1.当我们传入RowBounds 做翻页查询的时候,使用limit 物理分页,代替原来的逻辑分页. 2.在未启用日志组件的情况下,输出执行的SQL(先实现查询的拦截),并且统计SQL 的执行时间

最新文章

  1. day34 异常处理、断言、socket之ftp协议
  2. Android零基础入门第38节:初识Adapter
  3. c语言 switch语句大小,C语言switch语句(板式整齐)
  4. 第二篇: Mysql____语法格式——键值
  5. 合成复用原则java实例_第7节 合成复用原则
  6. HTML之iframe内联框架
  7. mysql同时查出符合条件数据与总数
  8. 工厂模式 构建者模式_实践中的构建者模式
  9. 精讲23种设计模式-基于责任链模式~构建企业级风控系统
  10. Java笔记-对CountDownLatch的理解(对比Qt中的QSemaphore)含实例
  11. Java 数组中new Object[5]语句是否创建了5个对象?
  12. jQuery2.x源码解析(设计篇)
  13. 理解RESTful架构(转)
  14. 使用WireMock 伪造 Rest 服务
  15. vs2010中svn使用教程_VS2010中使用ankhSVN
  16. python:求list的中位数
  17. JavaScript正则表达式学习笔记之一 - 理论基础
  18. WIN10设置自动拨号联网任务,实现开机、断网自动重连
  19. 类似于wps的linux软件,出了Office、WPS还有哪些好用的办公软件?
  20. ubuntu命令 图片 壁纸_[教程]Ubuntu下完整配置自动壁纸切换

热门文章

  1. java健身房管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  2. 【滤波器】最小均方(LMS)自适应滤波器
  3. QT常用控件——QListView控件
  4. 架构师之路 — 分布式系统 — 分布式网络分区难题
  5. 肖风:分布式网络是区块链机制设计的第一个层次
  6. 习题4-11 兔子繁衍问题
  7. 预加重/去加重/直流滤波
  8. Python pandas库的简单使用
  9. 计算机科学与技术_基于Java web的计算机图书借阅管理系统的设计与实现.docx
  10. 实现微信小程序版本管理