公司要整合rabbitmq与mybatis拦截器做一个数据同步功能。

整合过程中大部分环节都没什么问题,就是遇到了mybatis拦截器

@Intercepts(@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}))
@Component
public class MyBatisInterceptor implements Interceptor

  

  无法通过注解进行注入一些持久层的dao对象,导致dao一直取到空值。

  取dao对象目的是要查询当前代码的执行环境是生产还是测试环境。

  因为生产者代码不需要在测试环境执行,这个区分的数据存在数据库里面。

 

最初,我通过@Autowired是行不通的,因为

(截取自https://segmentfault.com/a/1190000023915286)

所以我继续寻找方法,于是我找到了用ApplicationContext的方式获取spring容器企图剑走偏锋

结果发现每一次执行ClassPathXmlApplicationContext都会导致容器重新加载,但是我这个MyBatisInterceptor带了@Component也会跟着重新加载,导致isGrey清空

甚至导致RabbitmqConfig这个类也跟着重新加载

导致这个监听容易一直重新加载,断点一直进入,这里有用到messageListener这个消息监听器也是一个单例bean对象,也会重新加载

所以会导致测试的时候出现bug,因为这个系统环境信息sysEnvInfo只需要加载一次

所以ApplicationContext这个方式也是走不通,我不推荐。

思来想去,我发现  mybatis拦截器  具体实现逻辑的方法  produceSqlData  里面我用的是  SpringBeanUtils.getBean  方法就能获取得到数据,

RabbitTemplate是定义在RabbitmqConfig代码里的,RabbitmqConfig这个类是个@Configuration注解

@Configuration
public class RabbitmqConfig

但是获取的数据是通过@Bean方式获取的,SpringBeanUtils.getBean无法获取到sqlSessionFactory

这里面的dao对象,所以直接

SysEnvInfoDao sysEnvInfoDao = (SysEnvInfoDao)SpringBeanUtils.getBean("sysEnvInfoDao", SysEnvInfoDao.class);

也会报空指针。

所以我思索了下,在@Configuration可以@Autowired成功,那我为何不参考rabbitTemplate一样把sysEnvInfo也变成一个bean的单例对象呢?

于是我将SysEnvInfo如rabbitTemplate一样配置成了单例bean对象,通过@Bean注解

在MyBatisInterceptor里面通过SpringBeanUtils.getBean方式获取,最后实践可行,不会出现重复加载容器的问题,也能在拦截器中取到spring bean

解决mybatis拦截器无法注入spring bean的问题的更多相关文章

  1. SpringBoot 注册拦截器方式及拦截器如何获取spring bean实例

    SpringBoot 注册拦截器时,如果用New对象的方式的话,如下: private void addTokenForMallInterceptor(InterceptorRegistry regi ...

  2. Mybatis拦截器实现分页

    本文介绍使用Mybatis拦截器,实现分页:并且在dao层,直接返回自定义的分页对象. 最终dao层结果: public interface ModelMapper { Page<Model&g ...

  3. mybatis拦截器使用

    目录 mybatis 拦截器接口Interceptor spring boot + mybatis整合 创建自己的拦截器MyInterceptor @Intercepts注解 mybatis拦截器入门 ...

  4. spring boot 使用拦截器 无法注入 配置值 、bean问题

    参考:https://www.cnblogs.com/SimonHu1993/p/8360701.html 一定要将 拦截器组件 交给spring容器进行管理,这样才能注入配置值,或者注入bean: ...

  5. 通过spring抽象路由数据源+MyBatis拦截器实现数据库自动读写分离

    前言 之前使用的读写分离的方案是在mybatis中配置两个数据源,然后生成两个不同的SqlSessionTemplate然后手动去识别执行sql语句是操作主库还是从库.如下图所示: 好处是,你可以人为 ...

  6. 基于Spring和Mybatis拦截器实现数据库操作读写分离

    首先需要配置好数据库的主从同步: 上一篇文章中有写到:https://www.cnblogs.com/xuyiqing/p/10647133.html 为什么要进行读写分离呢? 通常的Web应用大多数 ...

  7. spring boot 实现mybatis拦截器

    spring boot 实现mybatis拦截器 项目是个报表系统,服务端是简单的Java web架构,直接在请求参数里面加了个query id参数,就是mybatis mapper的query id ...

  8. Mybatis拦截器执行过程解析

    上一篇文章 Mybatis拦截器之数据加密解密 介绍了 Mybatis 拦截器的简单使用,这篇文章将透彻的分析 Mybatis 是怎样发现拦截器以及调用拦截器的 intercept 方法的 小伙伴先按 ...

  9. 玩转SpringBoot之整合Mybatis拦截器对数据库水平分表

    利用Mybatis拦截器对数据库水平分表 需求描述 当数据量比较多时,放在一个表中的时候会影响查询效率:或者数据的时效性只是当月有效的时候:这时我们就会涉及到数据库的分表操作了.当然,你也可以使用比较 ...

随机推荐

  1. 【操作系统】编程模拟FIFO,LRU,NUR,OPT页面置换算法

    #include<stdio.h> #include<stdlib.h> #include<time.h> #define random(x) (rand()%x) ...

  2. 贪心学院计算机视觉CV训练营

    贪心学院计算机视觉CV训练营 任务 Notes 其他 任务1:机器学习.深度学习简介 Note1 任务2:深度学习的发展历史 Note2 任务3:现代深度学习的典型例子 Note3 任务4:深度学习在 ...

  3. 【】JSON介绍

    0.说明 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写. 同时也易于机器解析和生成. 它是基于JavaScript Programm ...

  4. python 数据库查询,将查询的列名也保存下来,返回字典类型的数据

    前言: python + pymysql:通过pymysql,查询到符合要求的数据,不做类型转化的,返回的时元组类型的数据,可以根据下标,取想要的值. self.cursor.execute(sql) ...

  5. docker的无用镜像

    dangling images build 自己的 docker 镜像的时候,有时会遇到用一个甚至多个中间层镜像,这会一定程度上减少最终打包出来 docker 镜像的大小,但是会产生一些tag 为 n ...

  6. 简单的树莓派4b装64位系统+docker和docker-compose

    起因是这样的,我系统崩了 事先准备 wifi或网线 树莓派和电源 内存卡和读卡器 首先是装系统 去https://downloads.raspberrypi.org/raspios_arm64/ima ...

  7. Maven+ajax+SSM实现删除

    转载自:https://www.cnblogs.com/kebibuluan/p/9020381.html 3.尚硅谷_SSM高级整合_使用ajax操作实现删除的功能 点击删除的时候,要删除联系人,这 ...

  8. markdownFormat

      对文档编辑主要还是用wps,因为以前毕业论文都是用的它来编排(刚开始用wps毕业论文的时候真的是用的想吐,感觉非常不好用,而且功能太多但对于自己需要的功能又偏偏找不到),用过几次后还觉得用它编辑文 ...

  9. 数组内sizeof与strlen的区别

    1.数组在内存中是连续存放的,地址呈4个字节递增 2.数组的定义需要初始化,否则输出会已随机值输出 3.strlen()和sizeof()之间无关联:strlen():是求字符串长度的----只能针对 ...

  10. 用js判断页面是否加载完成实现代码

    方式一:window.onload: 当一个文档完全下载到浏览器中时,才会触发window.onload事件.这意味着页面上的全部元素对js而言都是可以操作的,也就是说页面上的所有元素加载完毕才会执行 ...