解决mybatis拦截器无法注入spring|解决mybatis拦截器无法注入spring bean的问题
公司要整合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是行不通的,因为
![解决mybatis拦截器无法注入spring|解决mybatis拦截器无法注入spring bean的问题](https://img.it610.com/image/info8/2e12bf639fc742a79a1e9698caca4d7c.jpg)
文章图片
(截取自https://segmentfault.com/a/1190000023915286)
所以我继续寻找方法,于是我找到了用ApplicationContext的方式获取spring容器企图剑走偏锋
![解决mybatis拦截器无法注入spring|解决mybatis拦截器无法注入spring bean的问题](https://img.it610.com/image/info8/185371b9ff0c41fcbb0ffa942544a0ec.jpg)
文章图片
结果发现每一次执行ClassPathXmlApplicationContext都会导致容器重新加载,但是我这个MyBatisInterceptor带了@Component也会跟着重新加载,导致isGrey清空
![解决mybatis拦截器无法注入spring|解决mybatis拦截器无法注入spring bean的问题](https://img.it610.com/image/info8/dd779b424fc84af3b6cc5e759b2a0da7.jpg)
文章图片
甚至导致RabbitmqConfig这个类也跟着重新加载
![解决mybatis拦截器无法注入spring|解决mybatis拦截器无法注入spring bean的问题](https://img.it610.com/image/info8/37e0aec2a9324a9e89b8ac1c0467ee74.jpg)
文章图片
导致这个监听容易一直重新加载,断点一直进入,这里有用到messageListener这个消息监听器也是一个单例bean对象,也会重新加载
![解决mybatis拦截器无法注入spring|解决mybatis拦截器无法注入spring bean的问题](https://img.it610.com/image/info8/592ca374b4c34556a21033022ac25a0d.jpg)
文章图片
![解决mybatis拦截器无法注入spring|解决mybatis拦截器无法注入spring bean的问题](https://img.it610.com/image/info8/e402610c444b47f3a31d1fc04b7c6b50.png)
文章图片
所以会导致测试的时候出现bug,因为这个系统环境信息sysEnvInfo只需要加载一次
所以ApplicationContext这个方式也是走不通,我不推荐。
思来想去,我发现mybatis拦截器具体实现逻辑的方法produceSqlData里面我用的是SpringBeanUtils.getBean方法就能获取得到数据,
![解决mybatis拦截器无法注入spring|解决mybatis拦截器无法注入spring bean的问题](https://img.it610.com/image/info8/a44b1b36bc4842a1bbd428a7483d648f.jpg)
文章图片
RabbitTemplate是定义在RabbitmqConfig代码里的,RabbitmqConfig这个类是个@Configuration注解
@Configuration public class RabbitmqConfig
![解决mybatis拦截器无法注入spring|解决mybatis拦截器无法注入spring bean的问题](https://img.it610.com/image/info8/c836ae27ce86471c84c90b9863da7a33.jpg)
文章图片
但是获取的数据是通过@Bean方式获取的,SpringBeanUtils.getBean无法获取到sqlSessionFactory
![解决mybatis拦截器无法注入spring|解决mybatis拦截器无法注入spring bean的问题](https://img.it610.com/image/info8/96498758d07049e2bddfcbd14a822231.jpg)
文章图片
这里面的dao对象,所以直接
SysEnvInfoDao sysEnvInfoDao = (SysEnvInfoDao)SpringBeanUtils.getBean("sysEnvInfoDao", SysEnvInfoDao.class);
也会报错,提示sysEnvInfoDao没有被定义。
所以我思索了下,在@Configuration可以@Autowired成功,那我为何不参考rabbitTemplate一样把sysEnvInfo也变成一个bean的单例对象呢?
于是我将SysEnvInfo如rabbitTemplate一样配置成了单例bean对象,通过@Bean注解
![解决mybatis拦截器无法注入spring|解决mybatis拦截器无法注入spring bean的问题](https://img.it610.com/image/info8/afed8d7ab2584145989174fcfcf7598b.jpg)
文章图片
在MyBatisInterceptor里面通过SpringBeanUtils.getBean方式获取,最后实践可行,不会出现重复加载容器的问题,也能在拦截器中取到spring bean
![解决mybatis拦截器无法注入spring|解决mybatis拦截器无法注入spring bean的问题](https://img.it610.com/image/info8/6a056941620f48479eb03c18fac4c83f.jpg)
文章图片
【解决mybatis拦截器无法注入spring|解决mybatis拦截器无法注入spring bean的问题】
推荐阅读
- parallels|parallels desktop 解决网络初始化失败问题
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- mybatisplus如何在xml的连表查询中使用queryWrapper
- mybatisplus|mybatisplus where QueryWrapper加括号嵌套查询方式
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- Spark|Spark 数据倾斜及其解决方案