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是⾏不通的,因为
所以我继续寻⽅法,于是我到了⽤ApplicationContext的⽅式获取spring容器企图剑⾛偏锋
结果发现每⼀次执⾏ClassPathXmlApplicationContext都会导致容器重新加载,但是我这个MyBatisInterceptor带了@Component也会跟着重新加载,导致isGrey清空
甚⾄导致RabbitmqConfig这个类也跟着重新加载
导致这个监听容易⼀直重新加载,断点⼀直进⼊,这⾥有⽤到messageListener这个消息也是⼀个单例bean对象,也会重新加载
所以会导致测试的时候出现bug,因为这个系统环境信息sysEnvInfo只需要加载⼀次spring framework高危漏洞
所以ApplicationContext这个⽅式也是⾛不通,我不推荐。
思来想去,我发现 mybatis 具体实现逻辑的⽅法 produceSqlData ⾥⾯我⽤的是 Bean ⽅法就能获取得到数据,
RabbitTemplate是定义在RabbitmqConfig代码⾥的,RabbitmqConfig这个类是个@Configuration注解
但是获取的数据是通过@Bean⽅式获取的,Bean⽆法获取到sqlSessionFactory
这⾥⾯的dao对象,所以直接
也会报错,提⽰sysEnvInfoDao没有被定义。
所以我思索了下,在@Configuration可以@Autowired成功,那我为何不参考rabbitTemplate⼀样把sysEnvInfo也变成⼀个bean的单例对象呢?
于是我将SysEnvInfo如rabbitTemplate⼀样配置成了单例bean对象,通过@Bean注解
在MyBatisInterceptor⾥⾯通过Bean⽅式获取,最后实践可⾏,不会出现重复加载容器的问题,也能在中取到spring bean
到此这篇关于mybatis⽆法注⼊spring bean的问题解决的⽂章就介绍到这了,更多相关mybatis⽆法注⼊spring bean内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论