Spring自定义数据源配置不当引起的Mybatis拦截器Interceptors 失效/不生效
目录
- 内容
- 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 失效/不生效相关推荐
- 搭建eclipse版的ssm+maven+tk.mybatis+redis及mybatis+spring多数据源配置集成的demo
前言:我这里搭建好eclipse版的ssm+maven+tk.mybatis+redis及mybatis+spring多数据源配置集成的demo.新手快速上手直接看demo. 最后处提供完整高质量de ...
- Spring多数据源配置和使用
Spring多数据源配置和使用 1.配置信息 <!--==============================bpt_mobdb数据库配置========================== ...
- Spring多数据源配置
Spring多数据源配置,这里持久层框架使用mybatis,集成Mybatis多数据源有两种方式: 1.创建多个SqlSessionFactory,扫描每个SqlSessionFactoryBean对 ...
- Spring多数据源配置以及动态切换实现
Spring多数据源配置以及动态切换实现 问题描述 一:首先是配置数据源 1.使用xml的bean节点来配置 2.使用yml配置+java代码实现配置 二:动态数据源 三:使用AOP切面实现动态数据源 ...
- spring(16)------spring的数据源配置
spring(16)------spring的数据源配置 在spring中,通过XML的形式实现数据源的注入有三种形式. 一.使用spring自带的DriverManagerDataSource 使用 ...
- java spring多数据源配置文件_深入理解spring多数据源配置
项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此.多数据源让人最头痛的,不是配置多个数据源,而是如何能灵活动态的切换数据源.例如在一个spring和hibernate的框架的 ...
- by mybatis 自定义order_springboot2结合mybatis拦截器实现主键自动生成
点击上方蓝字关注我们 1 01 前言 前阵子和朋友聊天,他说他们项目有个需求,要实现主键自动生成,不想每次新增的时候,都手动设置主键.于是我就问他,那你们数据库表设置主键自动递增不就得了.他的回答是他 ...
- Springboot 自定义mybatis 拦截器,实现我们要的扩展
前言 相信大家对拦截器并不陌生,对mybatis也不陌生. 有用过pagehelper的,那么对mybatis拦截器也不陌生了,按照使用的规则触发sql拦截,帮我们自动添加分页参数 . 那么今天,我们 ...
- list mybatis 接收 类型_基于mybatis拦截器实现的一款简易影子表自动切换插件
近期因工作需要,小编基于mybatis拦截器开发了一款简易影子表自动切换插件,可以根据配置实现动态修改表名,即将对原source table表的操作自动切换到对target table表的操作.该插件 ...
最新文章
- 到底是先更新数据库还是先更新缓存?
- 会计核算方法的组成及联系
- java8 java9 接口 interface
- Tomcat 8.5.29启动报TldScanner.scanJars错误问题解决办法
- android ConcurrentHashMap的使用
- 后台服务系统之什么是dubbo
- oracle删除已创建的用户,ORACLE用户创建删除
- 为什么要监控sql语句,以及如何监控,都有哪几种方式可以监控。
- flume 一对多hdfs_10PB 规模的 HDFS 数据在 eBay 的迁移实战
- IntelliJ IDEA 2017.1 EAP与异步堆栈跟踪调试器扩展
- kali linux查看局域网的电脑,kali linux 如何查找局域网ip
- Python单元测试框架之pytest -- fixtures
- 接口”安全机制”的设计
- 一网打尽位图与矢量图
- 用JS实现图片模糊到清晰预加载效果
- 《漫画算法2》2021全新进阶版来袭!
- RCF—用于C++的进程间通讯(4)
- mysql 分组查询最新
- P1967 货车运输( 最大生成树+LCA or Kruskal重构树)
- c语言中常量分为那两种,C语言中的常量和字面值