mybatis拦截器不生效_自动助力器失效是什么原因

mybatis拦截器不生效_自动助力器失效是什么原因现象:自定义插件注册成功,但是始终不进入拦截器方法;排查Mybatis拦截器是采用的责任链模式,一般拦截器中intercept方法中最后执行invocation.proceed()方法,将拦截器责任链向后传递;但是查看pageHelper源码可以发现,他的拦截器方法中并没有向后传递责任链,而是直接执行了查询:com.github.pagehelper.PageInterceptor#intercept思路想办法让自定义拦截器,在pageHelper拦截器之前执行;所以需要使自定义拦

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

现象:

自定义插件注册成功,但是始终不进入拦截器方法;
我的拦截器:
在这里插入图片描述
在这里插入图片描述

排查

Mybatis拦截器是采用的责任链模式,一般拦截器中intercept方法中最后执行 invocation.proceed() 方法,将拦截器责任链向后传递;

但是查看pageHelper源码可以发现,他的拦截器方法中并没有向后传递责任链,而是直接执行了另一个query方法:

  • com.github.pagehelper.PageInterceptor#intercept
    在这里插入图片描述

方案一

不管插件执行顺序,按规范文档来配置自定义插件即可:(即两个query方法都拦截)
在这里插入图片描述

方案二

想办法让自定义拦截器,在pageHelper拦截器之前执行,拦截第一个query方法:
(或者配置在pagehelper之后执行,拦截第二个query方法也是可以的);

所以需要使自定义拦截器在pagehelper之后添加;

  • 自定义插件配置类上添加注解: @AutoConfigureAfter({PageHelperAutoConfiguration.class})
@Configuration
@ConditionalOnBean({ 
   SqlSessionFactory.class})
@AutoConfigureAfter({ 
   PageHelperAutoConfiguration.class})  // 保证在分页插件之后加载
public class MybatisInterceptorConfig { 
    …… }
  • 将该配置类设置为一个 auto-configuration 类
# 创建src/main/resources/META-INF/spring.factories,声明该配置类即可

# spring.factories文件中  # 自定义配置类的全路径自己修改
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.hx.springbootmybatis.order.mybatis.MybatisInterceptorConfig  

方案三

就是方案二括号中的方式:(或者配置在pagehelper之后执行,拦截第二个query方法也是可以的); 把方案二中的注解改一下:

@AutoConfigureBefore({ 
   PageHelperAutoConfiguration.class})  // 保证在分页插件之前加载

而且这样还可以捕获到分页语句构建之后的 sql 了!

补充

CachingExecutor中有2个query方法:
在这里插入图片描述

另外提一个问题:query方法中调用了同对象中的另一个query方法,会再次进入拦截器吗?
答案:不会
观察源码得知,mybatis拦截器的执行逻辑是这样的,所以更加肯定的得出结论:不会;
在这里插入图片描述

总结:

Mybatis 插件的执行顺序有两种:
1、不同拦截对象执行顺序,如下:
	Executor` -> `StatementHandler` -> `ParameterHandler` -> `ResultSetHandler
2、拦截相同对象执行顺序,取决于 mybatis-config.xml 中 <plugin> 配置顺序,越靠后,优先级越高。
3、拦截相同对象执行顺序,如果是使用的配置类加载,则取决于配置类的加载顺序,加载顺序,越靠后,优先级越高;

参考链接:

1、http://xtong.tech/2018/08/01/MyBatis%E6%8B%A6%E6%88%AA%E5%99%A8%E5%9B%A0pagehelper%E8%80%8C%E5%A4%B1%E6%95%88%E7%9A%84%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/

2、https://zhuanlan.zhihu.com/p/266735787
3、QueryInterceptor 规范


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195510.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • clion2021.5激活码 linux【在线注册码/序列号/破解码】「建议收藏」

    clion2021.5激活码 linux【在线注册码/序列号/破解码】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 快速幂的大数运算_快速幂模

    快速幂的大数运算_快速幂模快速幂运算1.什么是快速幂2.快速幂的“小数”运算3.高精度(大数)的快速幂1.什么是快速幂快速幂,是指在进行幂运算的时候,用一种快速方法得出答案。比如,要求2^100的值,那按照最简单的方式,就是一个一个2去相乘,然后最终得到答案,那么这样就要计算100次,非常浪费时间,那么快速幂就是使用一种技巧使得将其计算次数减少,快速得到答案。2.快速幂的“小数”运算对于系统内置类型的整型,暂且叫他“小数”,这个时候进行快速幂运算,代码如下:#include<cstdio>#include&l

    2022年10月27日
  • CSDN博客皮肤设置

    CSDN博客皮肤设置当你看到其他博客主们的博客界面很好看的时候,是不是自己也想设置成这样的呢?不幸的是新版CDSN博客皮肤设置已下线,所以无法在上面直接切换其他皮肤。幸运的是,这里有其他方法,也能切换到你喜欢的皮肤,具体步骤如下:1、打开个人的博客设置,然后按f12打开审查元素,使用选择器,选择当前皮肤。你会在文件中看到有类名为:opt-skin-box的div,这些都是皮肤。…

  • linux桌面系统 9,红旗Linux系统RedFlag Linux Desktop 9.0安装教程

    linux桌面系统 9,红旗Linux系统RedFlag Linux Desktop 9.0安装教程以下分享红旗Linux操作系统RedFlagLinuxDesktop9.0安装教程,你可以用Vmware、VirtualBox虚拟机、硬盘、U盘、光盘的方式来安装。本文以光盘的方式来演示安装RedFlagLinuxDesktop9.0全过程。安装RedFlagLinuxDesktop9.0至少需要如下基本硬件配置:1.Intel或AMDCPU,推荐使用2GB以上内存。2.最少…

  • java压缩/解压war包

    java压缩/解压war包packagecom.kingsoft.unwar;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io

  • 百度地图api文档_奥维互动地图使用教程

    百度地图api文档_奥维互动地图使用教程新版百度地图API增加了发布版SHA1,开发版SHA1按官方教程操作即可,这里介绍一下发布版SHA1的获取方法。为apk签名,生成keystore文件(如果已经有keystore文件,跳过此步骤)打开cmd,定位文件夹到.andorid下,默认路径是users/用户名/.android输入keytool-list-v-keystore*.jks,*.jks为keystor

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号