Springboot?Filter中注入bean無效為null問題
Springboot Filter注入bean無效為null問題
問題原因
Web應(yīng)用的啟動順序是:
Lisenter->Fliter->Servlet
應(yīng)用程序上下文, 初始化 Fliter的時候,
還沒有初始化Servlert
所有沒有進(jìn)入DispacterServlet的初始化
故在Fliter中使用注解注入bean為空;
解決辦法
添加初始化bean配置,手動創(chuàng)建對象new
代碼如下:
package com.test.config; import com.alibaba.druid.support.http.StatViewServlet; import com.test.service.RequestFilter; import javax.servlet.Filter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.DelegatingFilterProxy; /** * @author lucasliang * @date 08/11/2018 5:56 afternoon filter load before dispathServlet ,so load RequestFilter as a * bean,new a RequestFilter */ @Configuration public class FilterConfig { /* *@param: [] *@return javax.servlet.Filter *@author lucasliang *@date 20/12/2018 *@Description filter */ @Bean public Filter uploadFilter() { return new RequestFilter(); } /* *@param: [] *@return org.springframework.boot.web.servlet.FilterRegistrationBean *@author lucasliang *@date 20/12/2018 *@Description filter */ @Bean @SuppressWarnings("unchecked") public FilterRegistrationBean testFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new DelegatingFilterProxy("uploadFilter")); registration.addUrlPatterns("/*"); registration.addInitParameter("paramName", "paramValue"); registration.setName("testFilter"); registration.setOrder(1); registration.setEnabled(false); return registration; } }
其中RequestFilter是手動創(chuàng)建的bean
實(shí)現(xiàn)了Filter接口
package com.test.service; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; public class RequestFilter implements Filter { private Logger logger = LoggerFactory.getLogger(Filter.class); @Value(value = "${encodeRules}") private String encodeRules; }
此時,在RequestFilter中使用@Value注解,就可以取到值了,注入bean也相同,會取到對應(yīng)的bean。
至此問題解決!
關(guān)于Spring中,注入的bean為null的情況
描述問題
在寫項目的時候,寫了一個工具類或者測試類,然后調(diào)用相關(guān)的service層或者dao層的bean,但是通通為null,為啥呢?
問題原因
兩種情況會導(dǎo)致如此問題,一個是工具類中的方法為靜態(tài)方法,靜態(tài)方法調(diào)用了bean,但是由于spring的加載機(jī)制,是加載靜態(tài)代碼-》構(gòu)造函數(shù)-》注入bean-》postconstuct的順序執(zhí)行,因此靜態(tài)方法里調(diào)用的bean,并沒有注入相應(yīng)的bean,因此為空,所以會出現(xiàn)bean為null的情況。
另一種情況是,調(diào)用工具類的時候,new了一個工具類的實(shí)例,該應(yīng)用里的實(shí)例都是交給spring IOC容器去看管維護(hù)的,現(xiàn)在突然new出來一個實(shí)例,spring IOC容器是沒有去看管他的,所以并不在同一個上下文中,那么new出來的這個類里面的實(shí)例方法,當(dāng)然也調(diào)用不到spring IOC上下文里的實(shí)例了,所以當(dāng)你調(diào)用你new出來的實(shí)例的方法時候,該方法里調(diào)用的spring的bean,都是沒有注入的對象的。
如何解決
解決辦法同樣有兩種,針對上面說的第一個問題的解決辦法是,使用注解@postconstruct的方法,手動注入bean,因?yàn)閜ostconstruct的方法,在bean加載完成之后,init之前執(zhí)行,所以在這個時間點(diǎn),注入相應(yīng)的bean對象,就會生效。
第二種方法是,直接把該工具類作為spring的一個bean組件,使用@component,在業(yè)務(wù)層調(diào)用的時候,也同樣使用注入的方式注入該工具類,這樣也可以解決問題了。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)在線考試系統(tǒng)與設(shè)計(學(xué)生功能)
這篇文章主要介紹了Java實(shí)現(xiàn)在線考試系統(tǒng)與設(shè)計(學(xué)生功能),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02Java集合中的WeakHashMap、IdentityHashMap、EnumMap詳解
這篇文章主要介紹了Java集合中的WeakHashMap、IdentityHashMap、EnumMap詳解,HashMap的key保留了對實(shí)際對象的強(qiáng)引用,這意味著只要HashMap對象不被銷毀,還HashMap的所有key所引用的對象就不會被垃圾回收,需要的朋友可以參考下2023-09-09idea導(dǎo)入項目不顯示maven側(cè)邊欄的問題及解決方法
這篇文章主要介紹了idea導(dǎo)入項目不顯示maven側(cè)邊欄的問題及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07