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

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

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

甚至導(dǎo)致RabbitmqConfig這個(gè)類也跟著重新加載

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


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

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

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

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

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

到此這篇關(guān)于mybatis攔截器無法注入spring bean的問題解決的文章就介紹到這了,更多相關(guān)mybatis攔截器無法注入spring bean內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
總結(jié)Java常用加解密方法AES?SHA1?md5
這篇文章主要為大家介紹了Java常用加密方法AES?SHA1?md5總結(jié)及示例demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
spring cloud 之 Feign 使用HTTP請(qǐng)求遠(yuǎn)程服務(wù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猻pring cloud 之 Feign 使用HTTP請(qǐng)求遠(yuǎn)程服務(wù)的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解
這篇文章主要介紹了SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解,@EnableWebSecurity是Spring?Security用于啟用Web安全的注解,典型的用法是該注解用在某個(gè)Web安全配置類上,實(shí)現(xiàn)了接口,需要的朋友可以參考下2023-12-12
使用spring boot開發(fā)時(shí)java對(duì)象和Json對(duì)象轉(zhuǎn)換的問題
這篇文章主要介紹了使用spring boot開發(fā)時(shí)java對(duì)象和Json對(duì)象轉(zhuǎn)換的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03

