• Mybatis插件原理和执行流程


    感谢尚硅谷的老师讲解

    插件
    插件存在的目的就相当于javaweb中的拦截器,可以拦截要操作的四大对象,包装对象
    额外添加内容,使得Mybatis的灵活性更强。

    插件原理 :

     * 在四大对象创建的时候
     * 1、每个创建出来的对象不是直接返回的,而是
     *      interceptorChain.pluginAll(parameterHandler);
     * 2、获取到所有的Interceptor(拦截器)(插件需要实现的接口);
     *      调用interceptor.plugin(target);返回target包装后的对象
     * 3、插件机制,我们可以使用插件为目标对象创建一个代理对象;AOP(面向切面)
     *      我们的插件可以为四大对象创建出代理对象;
     *      代理对象就可以拦截到四大对象的每一个执行;

    总结

    如果是插件声明拦截的对象,那么就会plugin返回包装类,为其创建一个代理对象,可以对指定方法进行拦截。

    public Object pluginAll(Object target) {
                for (Interceptor interceptor : interceptors) {
                  target = interceptor.plugin(target);
                }
                return target;
              }

    先来简单介绍下四大对象
    一张图明白四大对象关系:

    注意: ParameterHandler和ResultSetHandler都是用TypeHander处理类型

    Executor          //执行增删改查操作
    StatementHandler //处理sql语句预编译,设置参数等相关工作;
    ParameterHandler //设置预编译参数用的
    ResultSetHandler //处理结果集

    四大对象每个创建的时候都有一个

    注意:每个对象创建的时候 都会调用所有插件的plugin方法 对其进行包装操作

    interceptorChain.pluginAll(parameterHandler);

    如果多个插件对一个对象的方法进行拦截,就会产生层层拦截效果 第一个对象的动态代理对象传给第二个插件包装
    当执行目标方法的时候先调用第二个插件的intercept 然后调用第一个插件的intercept方法 最后执行真正的目标方法.


    一张图来理解执行顺序:

    总结:
    创建动态代理的时候 是按照插件配置顺序创建层层代理对象
    执行目标方法,是按逆向顺序执行的

    转: https://blog.csdn.net/qq_38409944/article/details/82494187

  • 相关阅读:
    C++ string 类的 find 方法实例详解
    linux系统中errno与error对照表
    tshark (wireshark)笔记
    自己签发免费ssl证书
    Go语言练习:网络编程实例——简易图片上传网站
    java开源工具包-Jodd框架
    数据库性能瓶颈解决方案
    [转载]如何快速学习一门技术
    [转载]IBM公司发布了最新的power7服务器p750 p770 p780
    计算机组成原理 — 指令系统
  • 原文地址:https://www.cnblogs.com/fps2tao/p/13538361.html
Copyright © 2020-2023  润新知