ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

mybatis拦截器执行过程及原理

2021-06-27 15:01:47  阅读:157  来源: 互联网

标签:执行器 拦截器 代理 mybatis 原理 执行 过程


本章是在阅读源码一步步的执行进行的一个原理讲解,比较任意通俗易懂,方便更加高效的理解mybatis插件的一个原理,帮助大家写出在不同的场景写出响应的插件。以下是我在阅读源码过程中的各个步骤间做的所做的事情,帮助大家更好的理解mybatis的拦截器原理。有什么不对的地方希望大家多多理解。

1.在解析的时候扫描带有plugins标签的内容,里面配置了我们需要的拦截器,这里可以配置多个拦截器,只需要我们实现Interceptor接口。

进行解析标签初始化我们实现的拦截器。

初始化过后的拦截器加入到责任链中,责任链内部用一个ArrayList进行一个链路的维护。

2.在解析完之后初始化拦截器,加入责任链。这是进行各种标签解析的过程,在解析完之后就是获取一个sqlSessionFactory工厂来获取相应的会话,在构建会话的时候会进行一些列的拦截器相关的代理流程。

关键在于在一步执行的过程configuration.newExecutor(tx, execType)

以下为创建执行器的一个过程,在后期代理过程都需要拿到执行器进行数据的查询。

在创建缓存处理器的时候CachingExecutor观察构造方法。进行了一个内部的装饰。真正执行的其实是最初创建的执行器。

真正核心的一个其实是interceptorChain.pluginAll(executor)拿到代理的执行器,用于执行相应的拦截,在后期执行查询的时候就需要利用执行器进行数据查询,当前会进行给执行器进行代理。

当前List interceptors = new ArrayList()里面存放着我们所有的拦截器链路。核心调用interceptor.plugin(target);由以下可见,可以重点关注mybatis的Plugin类,进行代理的执行类。

当前执行Plugin.wrap(target,this),第一个参数就是我们的执行器。上面也已经讲到了,下面就是被代理的一个过程,这里代理的是我们创建的执行器。CachingExecutor这是一个经过装饰的执行器。上面有讲过。

尽力过代理过后得到的执行器就是被代理过后的执行器了。创建了默认的一个会话器。        

3.代理对象的查询过程。这里演示在查询过程中经历的拦截过程作为演示。可以更好的理解在创建到执行的一个过程,什么时候进行调用,怎么调用,都经历了什么过程。

接下来就是拿到我们的代理对象。这里我就不详细介绍这个获取代理对象的详细过程了。当前文章主要是关注mybatis拦截器创建到拦截的过程。这里就是创建代理对象。

在执行了上述的流程之后,上述流程是一个查询流程的一个执行代理过程,其他原理后续会持续进行更新。下面我标注了executor.query(...)当前方法,这里的executor执行器就是被代理过后的一个执行器,上述有进行一个讲解。这里会进行一个代理,核心就在这里进行一个执行。

一下就会被进行代理来到这个代理方法。好了这个类是不是很熟悉。实现了InvocationHandler接口,这里就运用了jdk的动态代理。最后会执行我们的拦截器方法。interceptor.intercept(new Invocation(target, method, args));

来到我们实现的一个拦截器。这里帮我们把参数封装成了Invocation类,里面有我们需要的参数。其中最为关注的是private final Object[] args里面封装了我们的参数,重要对象。

这里我是自己写的一个执行器执行了一个查询操作,具体不是关注这个,真实的场景肯定不是这样查询到结果集的肯定是最后调用被装饰过后的执行器进行一个数据的查询,这里我只演示一个拦截器在创建到执行的一个过程。希望搭建更好的理解mybatis的执行器的原理。

这里就完成了mybatis拦截器创建到执行的一个过程,希望能给搭建带来帮助。有什么错误和不完整的地方希望搭建指出,第一次创作来之不易谢谢大家理解。后续将继续更新。

标签:执行器,拦截器,代理,mybatis,原理,执行,过程
来源: https://blog.csdn.net/m0_49516995/article/details/118273675

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有