關(guān)于SpringBoot攔截器中Bean無(wú)法注入的問(wèn)題
問(wèn)題
這兩天遇到SpringBoot攔截器中Bean無(wú)法注入問(wèn)題。下面介紹我的思考過(guò)程和解決過(guò)程:
1.由于其他bean在service,controller層注入一點(diǎn)問(wèn)題也沒(méi)有,開(kāi)始根本沒(méi)意識(shí)到Bean無(wú)法注入是在攔截器中無(wú)效的問(wèn)題,一直在查找注解指定的包在哪里配置的,然而卻找不到配置,Springboot是用java類(lèi)的形式加載配置的。在網(wǎng)絡(luò)的某個(gè)角落看到這樣的說(shuō)法:
SpringBoot項(xiàng)目的Bean裝配默認(rèn)規(guī)則是根據(jù)Application類(lèi)所在的包位置從上往下掃描!
“Application類(lèi)”是指SpringBoot項(xiàng)目入口類(lèi)。這個(gè)類(lèi)的位置很關(guān)鍵:
如果Application類(lèi)所在的包為:com.boot.app,則只會(huì)掃描com.boot.app包及其所有子包,如果service或dao所在包不在com.boot.app及其子包下,則不會(huì)被掃描!
即,把Application類(lèi)放到dao、service所在包的上級(jí),com.boot.Application
知道這一點(diǎn)非常關(guān)鍵,不知道spring文檔里有沒(méi)有給出說(shuō)明,如果不知道還真是無(wú)從解決。
我出問(wèn)題的類(lèi)確實(shí)在Application類(lèi)子包下面,看來(lái)不是這方面問(wèn)題。
2.開(kāi)始意識(shí)到只是攔截器上會(huì)有這樣的問(wèn)題,查詢(xún)?cè)驊?yīng)該是:
攔截器執(zhí)行在自動(dòng)bean初始化之前導(dǎo)致這個(gè)問(wèn)題的。
web里各個(gè)元素的執(zhí)行順序
在web.xml中各個(gè)元素的執(zhí)行順序是這樣的,context-param-->listener-->filter-->servlet; 而攔截器是在Spring MVC中配置的,如果從整個(gè)項(xiàng)目中看,一個(gè)servlet請(qǐng)求的執(zhí)行過(guò)程就變成了這樣context-param-->listener-->filter-->servlet-->interceptor(指的是攔截器),為什么攔截器是在servlet執(zhí)行之后,因?yàn)閿r截器本身就是在servlet內(nèi)部的。
各個(gè)元素具體概念
context-param:就是一些需要初始化的配置,放入context-param中,從而被監(jiān)聽(tīng)器(這里特指org.springframework.web.context.ContextLoaderListener)監(jiān)聽(tīng),然后加載;
監(jiān)聽(tīng)器(listener):就是對(duì)項(xiàng)目起到監(jiān)聽(tīng)的作用,它能感知到包括request(請(qǐng)求域),session(會(huì)話域)和applicaiton(應(yīng)用程序)的初始化和屬性的變化;
過(guò)濾器(filter):就是對(duì)請(qǐng)求起到過(guò)濾的作用,它在監(jiān)聽(tīng)器之后,作用在servlet之前,對(duì)請(qǐng)求進(jìn)行過(guò)濾;
servlet:就是對(duì)request和response進(jìn)行處理的容器,它在filter之后執(zhí)行,servlet其中的一部分就是controller層(標(biāo)記為servlet_2),還包括渲染視圖層(標(biāo)記為servlet_3)和進(jìn)入controller之前系統(tǒng)的一些處理部分(servlet_1),另外我們把servlet開(kāi)始的時(shí)刻標(biāo)記為servlet_0,servlet結(jié)束的時(shí)刻標(biāo)記為servlet_4。
攔截器(interceptor):就是對(duì)請(qǐng)求和返回進(jìn)行攔截,它作用在servlet的內(nèi)部,具體來(lái)說(shuō)有三個(gè)地方:
1)servlet_1和servlet_2之間,即請(qǐng)求還沒(méi)有到controller層
2)servlet_2和servlet_3之間,即請(qǐng)求走出controller層次,還沒(méi)有到渲染時(shí)圖層
3)servlet_3和servlet_4之間,即結(jié)束視圖渲染,但是還沒(méi)有到servlet的結(jié)束
元素之間關(guān)系圖
解決辦法
那就只是在攔截器中出現(xiàn)該問(wèn)題了,解決辦法如下:
首先上圖是我的攔截器和要注入的iRedisUtil對(duì)象,出問(wèn)題的就是這個(gè)iRedisUtil。
要解決問(wèn)題是在項(xiàng)目中繼承“WebMvcConfigurerAdapter”類(lèi)的類(lèi)中添加攔截器類(lèi)作為一個(gè)Bean,如下:
現(xiàn)在去運(yùn)行,發(fā)現(xiàn)iRedisUtil對(duì)象有值了。
到此這篇關(guān)于關(guān)于SpringBoot攔截器中Bean無(wú)法注入的問(wèn)題的文章就介紹到這了,更多相關(guān)SpringBoot攔截器Bean無(wú)法注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot2.0圖片上傳至本地或服務(wù)器并配置虛擬路徑的方法
最近寫(xiě)了關(guān)于圖片上傳至本地文件夾或服務(wù)器,上傳路徑到數(shù)據(jù)庫(kù),并在上傳時(shí)預(yù)覽圖片。本文通過(guò)實(shí)例代碼給大家分享spring boot2.0圖片上傳至本地或服務(wù)器并配置虛擬路徑的方法,需要的朋友參考下2018-12-12經(jīng)典的Java面試題及回答集錦(基礎(chǔ)篇)
本文給大家收藏整理了java面試題及回答,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-03-03java集合類(lèi)arraylist循環(huán)中刪除特定元素的方法
下面小編就為大家?guī)?lái)一篇Java集合類(lèi)ArrayList循環(huán)中刪除特定元素的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11Java 自定義Spring框架與Spring IoC相關(guān)接口分析
Spring框架是由于軟件開(kāi)發(fā)的復(fù)雜性而創(chuàng)建的。Spring使用的是基本的JavaBean來(lái)完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務(wù)器端的開(kāi)發(fā)2021-10-10詳解JAVA 設(shè)計(jì)模式之狀態(tài)模式
這篇文章主要介紹了JAVA 狀態(tài)模式的的相關(guān)資料,文中講解的非常細(xì)致,幫助大家更好的學(xué)習(xí)理解JAVA 設(shè)計(jì)模式,感興趣的朋友可以了解下2020-06-06Mybatis 中 Oracle 的拼接模糊查詢(xún)及用法詳解
這篇文章主要介紹了Mybatis 中 Oracle 的拼接模糊查詢(xún)及用法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08Java利用EasyExcel讀取寫(xiě)入Excel詳情
這篇文章主要介紹了Java利用EasyExcel讀取寫(xiě)入Excel詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Java 11 正式發(fā)布,這 8 個(gè)逆天新特性教你寫(xiě)出更牛逼的代碼
美國(guó)當(dāng)?shù)貢r(shí)間9月25日,Oracle 官方宣布 Java 11 (18.9 LTS) 正式發(fā)布,可在生產(chǎn)環(huán)境中使用!這是自 Java 8 后的首個(gè)長(zhǎng)期支持版本2018-09-09