目录

  • 内容
    • Interceptor接口与@Intercepts注解
    • PageHelper实现拦截器
    • 默认数据源与拦截器
    • 自定义数据源与拦截器的问题
    • 自定义数据源注入拦截器

内容

Interceptor接口与@Intercepts注解

org.apache.ibatis.plugin.Interceptor 是ibatis包的接口,

org.apache.ibatis.plugin.Intercepts 是ibatis包的注解

我们可以实现Interceptor 接口,并标注@Intercepts注解,

做一个mybatis执行SQL时的拦截器。

PageHelper实现拦截器

著名Mybatis插件Pagehelper就是这样实现了它的拦截器:

com.github.pagehelper.PageInterceptor

com.github.pagehelper.QueryInterceptor

@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),}
)
public class QueryInterceptor implements Interceptor {...
}

默认数据源与拦截器


默认配置下,sqlSessionFactory自己添加了拦截器

自定义数据源与拦截器的问题

不过最近同事那出了一个问题,系统之前使用这个拦截器没问题,突然就不能用了。

通过排查Mybatis源码,调用到拦截器的栈如下:

可以看到,在org.apache.ibatis.plugin.Plugin的方法中,会调用拦截器实现类的的intercept方法

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {try {Set<Method> methods = signatureMap.get(method.getDeclaringClass());if (methods != null && methods.contains(method)) {return interceptor.intercept(new Invocation(target, method, args));}return method.invoke(target, args);} catch (Exception e) {throw ExceptionUtil.unwrapThrowable(e);}
}

那么走不到拦截器,说明没注入,

我们查看对应mapper对象,看sqlSessionFactory中有没有拦截器,路径如下:

((InterceptorChain)((Configuration)((DefaultSqlSessionFactory)((SqlSessionTemplate)((MapperProxy)this.h).sqlSession).sqlSessionFactory).configuration).interceptorChain).interceptors

发现自定义的数据源时没有的,如果是Spring默认数据源配置,会帮我们注入好,如下

自定义数据源注入拦截器

//1.在自定义配置类上@Import对应拦截器,供SpringBoot对其装配,其实不写这一步也能让拦截器生效,写了可以让下面注入的属性不报红,还没细看如何自动注入的拦截器,不过大概就是该注解所标注的类、该接口的实现类都进行了BeanDefinition的注册之类的
@Import({***Interceptor.class, ***Interceptor.class})//注入拦截器@Autowiredprivate ***Interceptor ***Interceptor;@Autowiredprivate ***Interceptor ***Interceptor;//3.在生成SqlSessionFactory的方法中,通过setPlugins设置拦截器@Bean@Primarypublic SqlSessionFactory sqlSessionFactoryFfhj() throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(ffhjds);factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*.xml"));//重点factoryBean.setPlugins(new Interceptor[]{***Interceptor, ***Interceptor});return factoryBean.getObject();}

测试一遍,使用mapper时可以走到拦截器中了

Spring自定义数据源配置不当引起的Mybatis拦截器Interceptors 失效/不生效相关推荐

  1. 搭建eclipse版的ssm+maven+tk.mybatis+redis及mybatis+spring多数据源配置集成的demo

    前言:我这里搭建好eclipse版的ssm+maven+tk.mybatis+redis及mybatis+spring多数据源配置集成的demo.新手快速上手直接看demo. 最后处提供完整高质量de ...

  2. Spring多数据源配置和使用

    Spring多数据源配置和使用 1.配置信息 <!--==============================bpt_mobdb数据库配置========================== ...

  3. Spring多数据源配置

    Spring多数据源配置,这里持久层框架使用mybatis,集成Mybatis多数据源有两种方式: 1.创建多个SqlSessionFactory,扫描每个SqlSessionFactoryBean对 ...

  4. Spring多数据源配置以及动态切换实现

    Spring多数据源配置以及动态切换实现 问题描述 一:首先是配置数据源 1.使用xml的bean节点来配置 2.使用yml配置+java代码实现配置 二:动态数据源 三:使用AOP切面实现动态数据源 ...

  5. spring(16)------spring的数据源配置

    spring(16)------spring的数据源配置 在spring中,通过XML的形式实现数据源的注入有三种形式. 一.使用spring自带的DriverManagerDataSource 使用 ...

  6. java spring多数据源配置文件_深入理解spring多数据源配置

    项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此.多数据源让人最头痛的,不是配置多个数据源,而是如何能灵活动态的切换数据源.例如在一个spring和hibernate的框架的 ...

  7. by mybatis 自定义order_springboot2结合mybatis拦截器实现主键自动生成

    点击上方蓝字关注我们 1 01 前言 前阵子和朋友聊天,他说他们项目有个需求,要实现主键自动生成,不想每次新增的时候,都手动设置主键.于是我就问他,那你们数据库表设置主键自动递增不就得了.他的回答是他 ...

  8. Springboot 自定义mybatis 拦截器,实现我们要的扩展

    前言 相信大家对拦截器并不陌生,对mybatis也不陌生. 有用过pagehelper的,那么对mybatis拦截器也不陌生了,按照使用的规则触发sql拦截,帮我们自动添加分页参数 . 那么今天,我们 ...

  9. list mybatis 接收 类型_基于mybatis拦截器实现的一款简易影子表自动切换插件

    近期因工作需要,小编基于mybatis拦截器开发了一款简易影子表自动切换插件,可以根据配置实现动态修改表名,即将对原source table表的操作自动切换到对target table表的操作.该插件 ...

最新文章

  1. 到底是先更新数据库还是先更新缓存?
  2. 会计核算方法的组成及联系
  3. java8 java9 接口 interface
  4. Tomcat 8.5.29启动报TldScanner.scanJars错误问题解决办法
  5. android ConcurrentHashMap的使用
  6. 后台服务系统之什么是dubbo
  7. oracle删除已创建的用户,ORACLE用户创建删除
  8. 为什么要监控sql语句,以及如何监控,都有哪几种方式可以监控。
  9. flume 一对多hdfs_10PB 规模的 HDFS 数据在 eBay 的迁移实战
  10. IntelliJ IDEA 2017.1 EAP与异步堆栈跟踪调试器扩展
  11. kali linux查看局域网的电脑,kali linux 如何查找局域网ip
  12. Python单元测试框架之pytest -- fixtures
  13. 接口”安全机制”的设计
  14. 一网打尽位图与矢量图
  15. 用JS实现图片模糊到清晰预加载效果
  16. 《漫画算法2》2021全新进阶版来袭!
  17. RCF—用于C++的进程间通讯(4)
  18. mysql 分组查询最新
  19. P1967 货车运输( 最大生成树+LCA or Kruskal重构树)
  20. c语言中常量分为那两种,C语言中的常量和字面值

热门文章

  1. 采集学校网站数据的10个经典方法
  2. Android仿淘宝支付安全码
  3. 支付宝怎么做风险控制?
  4. Nacos学习笔记 (1)Nacos的简介与安装
  5. Kafka 的简单介绍
  6. 进制转换:十六进制转八进制、十六进制转十进制
  7. Solid Converter PDF10.1Crack,将pdf表转换为可编辑的Excel文档
  8. 农民工工地受伤是否就可以申请工伤?
  9. 验证码-kaptcha
  10. 哈佛女校长给2008年本科毕业生的演讲