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)


相关推荐

  • 终极对决!Dubbo 和 Spring Cloud 微服务架构到底孰优孰劣?「建议收藏」

    终极对决!Dubbo 和 Spring Cloud 微服务架构到底孰优孰劣?「建议收藏」前言核心部件1总体架构2微服务架构核心要素通讯协议1支持协议2性能比较服务依赖方式组件运行流程微服务架构组成以及注意事项1架构分解2注意事项总结前言微服务架构是互联网很热门的话题,是互联网技术发展的必然结果。它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。虽然微服务架构没有公认的技术标准和规范或者草案,但业界已经有一些很有影

  • Linux 批量杀进程[通俗易懂]

    Linux 批量杀进程[通俗易懂]1.查需要杀死的进程ps-ef|grepyum2.去除掉里面的grepps-ef|grepyum|grep-vgrep3.打印kill命令ps-ef|grepyum|grep-vgrep|awk'{print”kill”$2}’4.执行kill命令ps-ef|grepyum|grep-vgrep|awk'{print”kill”$2}’|sh删除完成…

  • 怎样基于android4.4.2的源代码和android-4.3.1_r1的驱动编译I9250的ROM

    怎样基于android4.4.2的源代码和android-4.3.1_r1的驱动编译I9250的ROM

    2021年11月16日
  • 原码,反码,补码的深入理解与原理答案_原码反码补码例题详解

    原码,反码,补码的深入理解与原理答案_原码反码补码例题详解本文从原码讲起。通过简述原码,反码和补码存在的作用,加深对补码的认识。力争让你对补码的概念不再局限于:负数的补码等于反码加一。接触过计算机或电子信息相关课程的同学,应该都或多或少看过补码这哥仨。每次都是在课本的最前几页,来上这么一段:什么反码是原码除符号位,按位取反。补码等于反码加一。然后给整得莫名其妙,稀里糊涂地,接着就是翻页,反正后面的内容也跟三码没多大关系。我原来也是…

  • Android 中文 API (29) —— CompoundButton[通俗易懂]

    Android 中文 API (29) —— CompoundButton[通俗易懂]前言  本章内容是android.widget.CompoundButton,翻译来自德罗德,再次感谢德罗德!期待你一起参与AndroidAPI的中文翻译,联系我over140@gmail.com。 声明  欢迎转载,但请保留文章原始出处:)    博客园:http://www.cnblogs.com/    Android中文翻译组:http://www.cnblogs.com…

  • python读取excel文件显示文件不存在?_python怎么读取excel

    python读取excel文件显示文件不存在?_python怎么读取excelpython处理Excel相关说明:1、Python自带的csv模块可以处理.csv文件。2、xlrd和xlwt两个模块分别用来读Excel和写Excel,只支持.xls和.xlsx格式,xlutils模块可以同时读写一个已存在的Excel文件,依赖于xlrd和xlwt。3、openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件;2007一下的版…

发表回复

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

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