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方法前后還可以應用到其他方法的前后攔截器。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM