小編給大家分享一下SpringBoot之?dāng)r截器注入Bean的示例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)建站于2013年開始,先為祥云等服務(wù)建站,祥云等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為祥云企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
由于業(yè)務(wù)需要,需要在攔截器中操作redis緩存,按照 controller,service層配置發(fā)現(xiàn)無法注入,一直報(bào)空指針異常。
解決方案
@Configuration public class MyWebAppConfigurer extends WebMvcConfigurerAdapter { /** * 將自定義攔截器作為Bean寫入配置 * @return */ @Bean public SysInterceptor sysInterceptor() { return new SysInterceptor(); } /** * 對攔截器注冊 */ @Override public void addInterceptors(InterceptorRegistry registry) { String[] patterns = new String[] {"/swagger-resources/**"}; registry.addInterceptor(sysInterceptor()) .addPathPatterns("/**") .excludePathPatterns(patterns); super.addInterceptors(registry); } }
攔截器:
public class SysInterceptor implements HandlerInterceptor { private static final Logger logger = LoggerFactory.getLogger(SysInterceptor.class); @Autowired private RedisTemplateredisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //業(yè)務(wù)邏輯 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
查詢原因
攔截器執(zhí)行在Bean初始化之前導(dǎo)致這個(gè)問題的。在web.xml中各個(gè)元素的執(zhí)行順序是這樣的,context-param-->listener-->filter-->servlet; 而攔截器是在Spring MVC中配置的,如果從整個(gè)項(xiàng)目中看,一個(gè)servlet請求的執(zhí)行過程就變成了這樣context-param-->listener-->filter-->servlet-->interceptor,為什么攔截器是在servlet執(zhí)行之后,因?yàn)閿r截器本身就是在servlet內(nèi)部的。
概念
servlet:servlet是一種運(yùn)行服務(wù)器端的java應(yīng)用程序,具有獨(dú)立于平臺(tái)和協(xié)議的特性,并且可以動(dòng)態(tài)的生成web頁面,它工作在客戶端請求與服務(wù)器響應(yīng)的中間層。
filter:filter是一個(gè)可以復(fù)用的代碼片段,可以用來轉(zhuǎn)換HTTP請求、響應(yīng)和頭信息。Filter不像Servlet,它不能產(chǎn)生一個(gè)請求或者響應(yīng),它只是修改對某一資源的請求,或者修改從某一的響應(yīng)。
listener:監(jiān)聽器,從字面上可以看出listener主要用來監(jiān)聽只用。通過listener可以監(jiān)聽web服務(wù)器中某一個(gè)執(zhí)行動(dòng)作,并根據(jù) 其要求作出相應(yīng)的響應(yīng)。通俗的語言說就是在application,session,request三個(gè)對象創(chuàng)建消亡或者往其中添加修改刪除屬性時(shí)自動(dòng)執(zhí) 行代碼的功能組件。
interceptor:攔截器是對過濾器更加細(xì)化的應(yīng)用,他不僅可以應(yīng)用在service方法前后還可以應(yīng)用到其他方法的前后攔截器。
以上是SpringBoot之?dāng)r截器注入Bean的示例的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!