注意:此系列源代码分析基于Mybatis 3.5.6,源代码的源代码,源代码仓库地址:Funcy/Mybatis。
Mybatis的拦截器可以拦截一些操作。相应的mybatis文档是mybatis插头-in
与文档相反,让我们先准备演示!
根据文档内容,我们准备一个拦截器:
将拦截器添加到配置文件中:
运行,结果如下:
可以看出,执行SQL已成功打印。
2.1分析拦截器是在MyBatis配置文件中配置的,因此拦截器也将在解析配置文件中解析:
分析操作更常规,因此我们不分析观察拦截器过程的主要方法:
拦截器最终存储在类的成员变量中。
这是什么?我们继续:
从代码来看,它在内部维护一种成员变量,提供和操作方法。
2.2组装Mybatis的拦截器存储在类的成员变量中。这些拦截器如何在执行链接上组装?让我们回到途中,有这样的行:
它用于处理拦截器加载:
此处传递的类型是,也是返回。
继续输入该方法:
这是接口的默认方法。电话是我们继续:
从代码的角度来看,JDK的动态代理函数将生成代理对象。它已实现。它的方法是拦截的关键。我们将稍后进行分析。
在该示例中,将原始内容传递给,并获得了动态代理类:
本文中使用的示例是拦截和方法。实际上,还有其他拦截方法。Mybatis Interceptor支持的方法如下:
这些方法的拦截配置没有太大不同,因此不再有分析。
在对上一节的分析中,我们得到了动态代理对象,那么它何时执行?
实际上,被动代理的对象在执行该方法时会调用主题的方法,动态代理对象是,我们输入其方法:
在该方法中,首先确定该方法是否应拦截。对于需要拦截的方法,该方法被调用,否则该方法将直接调用。
在执行中,传递的参数是,让我们看看它是什么:
该类主要保留,当重写方法时,我们可以根据这些内容完成一系列操作。
还有一个重要的方法:此方法将执行目标方法的逻辑,例如当我们实施它时,它将被使用:
处理拦截操作后,不要忘记执行原始逻辑的呼叫。
本文是对拦截器机制的分析,分析了分析,组装和执行过程。在最终分析中,拦截器仍然使用JDK提供的动态代理函数。
这就是拦截器的相关分析。
本文中的原始链接:https://my.oschina.net/funcy/blog/4952678,仅限于作者的个人级别,文章中有不可避免的事情,欢迎使用CROCKE!请与作者联系以获取业务重印。请指示非商业重印的来源。
原始:https://juejin.cn/post/7102812108902891550