mybatis攔截器無法注入spring bean的問題解決
公司要整合rabbitmq與mybatis攔截器做一個數(shù)據(jù)同步功能。
整合過程中大部分環(huán)節(jié)都沒什么問題,就是遇到了mybatis攔截器
@Intercepts(@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}))
@Component
public class MyBatisInterceptor implements Interceptor無法通過注解進行注入一些持久層的dao對象,導致dao一直取到空值。
取dao對象目的是要查詢當前代碼的執(zhí)行環(huán)境是生產還是測試環(huán)境。
因為生產者代碼不需要在測試環(huán)境執(zhí)行,這個區(qū)分的數(shù)據(jù)存在數(shù)據(jù)庫里面?!?/p>
最初,我通過@Autowired是行不通的,因為

所以我繼續(xù)尋找方法,于是我找到了用ApplicationContext的方式獲取spring容器企圖劍走偏鋒

結果發(fā)現(xiàn)每一次執(zhí)行ClassPathXmlApplicationContext都會導致容器重新加載,但是我這個MyBatisInterceptor帶了@Component也會跟著重新加載,導致isGrey清空

甚至導致RabbitmqConfig這個類也跟著重新加載

導致這個監(jiān)聽容易一直重新加載,斷點一直進入,這里有用到messageListener這個消息監(jiān)聽器也是一個單例bean對象,也會重新加載


所以會導致測試的時候出現(xiàn)bug,因為這個系統(tǒng)環(huán)境信息sysEnvInfo只需要加載一次
所以ApplicationContext這個方式也是走不通,我不推薦。
思來想去,我發(fā)現(xiàn) mybatis攔截器 具體實現(xiàn)邏輯的方法 produceSqlData 里面我用的是 SpringBeanUtils.getBean 方法就能獲取得到數(shù)據(jù),

RabbitTemplate是定義在RabbitmqConfig代碼里的,RabbitmqConfig這個類是個@Configuration注解

但是獲取的數(shù)據(jù)是通過@Bean方式獲取的,SpringBeanUtils.getBean無法獲取到sqlSessionFactory

這里面的dao對象,所以直接
也會報錯,提示sysEnvInfoDao沒有被定義。
所以我思索了下,在@Configuration可以@Autowired成功,那我為何不參考rabbitTemplate一樣把sysEnvInfo也變成一個bean的單例對象呢?
于是我將SysEnvInfo如rabbitTemplate一樣配置成了單例bean對象,通過@Bean注解

在MyBatisInterceptor里面通過SpringBeanUtils.getBean方式獲取,最后實踐可行,不會出現(xiàn)重復加載容器的問題,也能在攔截器中取到spring bean

到此這篇關于mybatis攔截器無法注入spring bean的問題解決的文章就介紹到這了,更多相關mybatis攔截器無法注入spring bean內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot集成logback打印彩色日志的代碼實現(xiàn)
Logback是由log4j創(chuàng)始人設計的另一個開源日志組件,默認情況下,Spring?Boot會用Logback來記錄日志,并用INFO級別輸出到控制臺,本文給大家介紹了SpringBoot集成logback打印彩色日志,需要的朋友可以參考下2024-03-03
SpringBoot實現(xiàn)Excel文件批量上傳導入數(shù)據(jù)庫
這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)Excel文件批量上傳導入數(shù)據(jù)庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11
Spring+quartz實現(xiàn)定時發(fā)送郵件功能實例
spring提供的定時發(fā)送郵件功能一直深受廣大web開發(fā)者的喜愛,這篇文章主要介紹了Spring+quartz實現(xiàn)定時發(fā)送郵件功能實例,有興趣的可以了解一下。2017-03-03
springboot配置文件如何實現(xiàn)多個yml相互讀取問題
在SpringBoot應用中,可以通過多種方式實現(xiàn)多個YAML配置文件的相互讀取和組合,SpringBoot2.4及以上版本可以使用spring.config.import屬性導入其他配置文件,@PropertySource注解雖不支持YAML2024-11-11

