javascript
Spring 拦截器和过滤器中自动注入为 null 的原因及解决方案
起因
開發(fā)過程中在過濾器(filter)中注入Bean出現(xiàn)空指針異常,通過查找資料了解空指針的原因,特此記錄。
問題分析
由于其他bean在service,controller層注入一點(diǎn)問題也沒有,開始根本沒意識(shí)到Bean無法注入是在攔截器中無效的問題。
“Application類”是指SpringBoot項(xiàng)目入口類。這個(gè)類的位置很關(guān)鍵:
如果Application類所在的包為:com.root.app,則只會(huì)掃描com.root.app包及其所有子包,如果service或dao所在包不在com.root.app及其子包下,則不會(huì)被掃描!
即, 把Application類放到dao、service所在包的上級(jí),com.root.Application
我出問題的類確實(shí)在Application類子包下面,排除此項(xiàng)。
攔截器執(zhí)行在自動(dòng)bean初始化之前導(dǎo)致這個(gè)問題的。
Spring web中各個(gè)元素的初始化順序
在web.xml中各個(gè)元素的執(zhí)行順序:
context-param–>listener–>filter–>servlet
而攔截器是在Spring MVC中配置的,如果從整個(gè)項(xiàng)目中看,一個(gè)servlet請(qǐng)求的執(zhí)行過程就變成了這樣:
context-param–>listener–>filter–>servlet–>interceptor(指的是攔截器)
為什么攔截器是在servlet執(zhí)行之后,因?yàn)閿r截器本身就是在servlet內(nèi)部的。
元素具體概念
-  
context-param:就是一些需要初始化的配置,放入context-param中,從而被監(jiān)聽器(這里特指org.springframework.web.context.ContextLoaderListener)監(jiān)聽,然后加載;
 -  
listener(監(jiān)聽器):就是對(duì)項(xiàng)目起到監(jiān)聽的作用,它能感知到包括request(請(qǐng)求域),session(會(huì)話域)和applicaiton(應(yīng)用程序)的初始化和屬性的變化;
 -  
filter(過濾器):就是對(duì)請(qǐng)求起到過濾的作用,它在監(jiān)聽器之后,作用在servlet之前,對(duì)請(qǐng)求進(jìn)行過濾;
 -  
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開始的時(shí)刻標(biāo)記為servlet_0,servlet結(jié)束的時(shí)刻標(biāo)記為servlet_4。
 -  
interceptor(攔截器):就是對(duì)請(qǐng)求和返回進(jìn)行攔截,它作用在servlet的內(nèi)部,具體來說有三個(gè)地方:
1)servlet_1和servlet_2之間,即請(qǐng)求還沒有到controller層2)servlet_2和servlet_3之間,即請(qǐng)求走出controller層次,還沒有到渲染時(shí)圖層
3)servlet_3和servlet_4之間,即結(jié)束視圖渲染,但是還沒有到servlet的結(jié)束
 
解決方案
問題原因
造成null的原因是因?yàn)?strong>攔截器加載是在springcontext創(chuàng)建之前完成的,所以在攔截器中注入實(shí)體自然就為null。
注入為null的時(shí)候,是通過new的方式創(chuàng)建的攔截器,通過new出來的實(shí)例是沒有交給spring進(jìn)行管理的,沒有被spring管理的實(shí)例,spring是無法自動(dòng)注入bean的,所以為null
參考連接:
- https://blog.csdn.net/ycf921244819/article/details/91388440
 - https://www.cnblogs.com/shamo89/p/8534580.html
 
總結(jié)
以上是生活随笔為你收集整理的Spring 拦截器和过滤器中自动注入为 null 的原因及解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 狗头ap上单符文天赋(ap狗头天赋符文怎
 - 下一篇: 如何安装海尔滚筒洗衣机_海尔滚筒洗衣机安