這篇文章帶給大家的內容是關於SpringBoot之攔截器注入Bean的方法介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
由於業務需要,需要在攔截器中操作Redis緩存,按照 controller,service層配置發現無法注入,一直報空指標異常。
解決方案
@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 RedisTemplate<String, String> redisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //业务逻辑 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 { } }
查詢原因
攔截器執行在Bean初始化之前導致這個問題的。在web.xml中各個元素的執行順序是這樣的,context-param-->listener-->filter-->servlet; 而攔截器是在Spring MVC中配置的,如果從整個專案中看,一個servlet請求的執行過程變成了這樣context-param-->listener-->filter-->servlet-->interceptor,為什麼攔截器是在servlet執行之後,因為攔截器本身就是在servlet內部的。
概念
servlet:servlet是一種運行伺服器端的java應用程序,具有獨立於平台和協定的特性,並且可以動態的生成web頁面,它工作在客戶端請求與伺服器回應的中間層。
filter:filter是可以重複使用的程式碼片段,可以用來轉換HTTP請求、回應和頭資訊。 Filter不像Servlet,它不能產生一個請求或回應,它只是修改某一資源的請求,或修改從某一的回應。
listener:監聽器,從字面上可以看出listener主要用來監聽只用。透過listener可以監聽web伺服器中某一個執行動作,並根據 其要求作出相應的回應。通俗的語言說就是在application,session,request三個物件建立消亡或往其中新增修改刪除屬性時自動執 行程式碼的功能元件。
interceptor:攔截器是對過濾器更加細緻的應用,他不僅可以應用在service方法前後還可以應用到其他方法的前後攔截器。
以上是SpringBoot之攔截器注入Bean的方法介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!