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 规范


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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于Vue的电商后台管理系统

    基于Vue的电商后台管理系统前端项目是基于Vue的SPA项目,前端技术栈采用Vue+VueRouter+Element-UI+Axios+Echarts。目前完成进度:登陆界面、登录和退出功能、导航守卫功能

    2022年6月14日
    32
  • chmod的使用方法_chmod 命令

    chmod的使用方法_chmod 命令chmoda+xplatform814_linux32.bin意思是给platform814_linux32.bin文件所有用户添加x(可执行)权限chmod是一个改变文件权限的命令其中u代表用户,g代表组,o代表其他,a代表全部中间的+代表添加,-代表取消,=代表重设最后r代表可读,w代表可写,x代表可执行

    2022年10月20日
    0
  • 性能测试平台ngrider

    性能测试平台ngrider一 ngrider 简介 nGrinder 是 NHN 公司基于 Grinder 开发的开源性能测试平台 1 b s 架构 非常易用 有友好简洁的用户界面 能在 Windows linux mac 系统运行 2 具有 controller agent 分布式结构的强大的压力测试工具 能够执行性能测试和监控目标服务器 并保存这些数据生成测试报告 通过动态图和数据表的形式展示出来 3 可以自动生成 jython 和 groovy 语言的脚本 当然 如果想执行一些比较复杂场景的性能测试 测试人员也可以自己编写脚本 导入进来 二 n

    2025年6月6日
    0
  • VUE 网页生成 PDF[通俗易懂]

    VUE 网页生成 PDF[通俗易懂]保存当前网页为PDF格式到本地一、安装依赖1.npminstall–savehtml2canvas//作用是html转图片2.npminstalljspdf–save//再将图片转为pdf二、设置格式函数importhtml2Canvasfrom’html2canvas’importJsPDFfrom’jspdf’exportdef…

    2022年5月16日
    125
  • 用python语言实现人工智能猴子摘香蕉的问题_人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次 -…[通俗易懂]

    用python语言实现人工智能猴子摘香蕉的问题_人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次 -…[通俗易懂]人工智能课内实验报告(8次)学院:自动化学院班级:智能1501姓名:刘少鹏(34)学号:06153034目录课内实验1:猴子摘香蕉问题的VC编程实现????????1课内实验2:编程实现简单动物识别系统的知识表示???5课内实验3:盲目搜索求解8数码问题?????????18课内实验4:回溯算法求解四皇后问题???…

    2022年9月26日
    0
  • JDBC API 4.2(十):DatabaseMetaData 接口源码分析「建议收藏」

    JDBC API 4.2(十):DatabaseMetaData 接口源码分析「建议收藏」1、简介DatabaseMetaData接口提供了获取数据库元数据的方法,例如数据库名称,数据库版本,驱动程序名称,表总数,视图总数等。该接口由驱动程序供应商实现,以使用户了解数据库管理系统(DBMS)的功能以及与之结合使用的基于JDBC技术的驱动程序。不同的DBMS通常支持不同的功能,以不同的方式实现功能以及使用不同的数据类型。另外,驱动程序可以在DBMS提供的功能之上实现功能。该接…

    2022年10月29日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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