1 WebMvcConfigurer是一個接口,提供很多自定義的攔截器,例如跨域設置、類型轉化器等等。可以說此接口為開發者提前想到了很多攔截層面的需求,方便開發者自由選擇使用。由於Spring5.0廢棄了WebMvcConfigurerAdapter,所以WebMvcConfigurer繼承了WebMvcConfigurerAdapter大部分內容。
2.configureContentNegotiation(ContentNegotiationConfigurer configurer)
這個東西直譯叫做內容協商機制,主要是方便一個請求路徑返回多個數據格式。ContentNegotiationConfigurer這個配置里面你會看到MediaType,里面有眾多的格式。此方法不在多贅述。
3.configureAsyncSupport(AsyncSupportConfigurer configurer)
顧名思義,這是處理異步請求的。只能設置兩個值,一個超時時間(毫秒,Tomcat下默認是10000毫秒,即10秒),還有一個是AsyncTaskExecutor,異步任務執行器。
4.configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
這個接口可以實現靜態文件可以像Servlet一樣被訪問。
5.addFormatters(FormatterRegistry registry)
增加轉化器或者格式化器。這邊不僅可以把時間轉化成你需要時區或者樣式。還可以自定義轉化器和你數據庫做交互,比如傳進來userId,經過轉化可以拿到user對象。
6.addInterceptors(InterceptorRegistry registry)
盼望着,盼望着,你一個常用的方法來了。這個方法可以自定義寫攔截器,並指定攔截路徑。來,咱們寫一個攔截器。
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle,ok,假設給你一個true,運行去吧"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle,ok,看看我什么時候運行的。"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion,ok,看完不點個贊再走嗎?"); } }
然后配置一下:
@Configuration public class MyConfigurer implements WebMvcConfigurer { @Bean public MyInterceptor getMyInterceptor(){ return new MyInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(this.getMyInterceptor()) .addPathPatterns("/abc","/configurePathMatch"); } }
可以看出addPathPatterns()里面可以嘗試添加多個路徑,或者寫成”/**“,包含所有路徑都需要嘗試攔截一下。
測試一下,輸出
preHandle,ok,假設給你一個true,運行去吧 ===》執行業務邏輯===》 postHandle,ok,看看我什么時候運行的。 afterCompletion,ok,看完不點個贊再走嗎?
7.addResourceHandlers(ResourceHandlerRegistry registry)
自定義資源映射。這個東西也比較常用,業務場景就是自己的服務器作為文件服務器,不利用第三方的圖床,就需要一個虛擬路徑映射到我們服務器的地址。值得一提的是,如果你的項目是war包啟動,一般都是再Tomcat中配置一下(配置方法請百度);如果是jar包啟動(SpringBoot經常用這種方式啟動),就可以用到這個方法了。例如:
public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/my/**") .addResourceLocations("file:E:/my/"); super.addResourceHandlers(registry); }
真實路徑,wndows當服務器的情況下,前面一定要加上一個file:。
8.addCorsMappings(CorsRegistry registry)
這個是設置跨域問題的,幾乎是每個后台服務器都需要配置的東西。我曾寫過一篇文章,專門講跨域問題和SpringBoot怎么配置的,請查詢:
https://juejin.im/post/5cfe6367f265da1b9163887f
9.addViewControllers(ViewControllerRegistry registry)
這個方法可以實現,一個路徑自動跳轉到一個頁面。不過現在多為前后端分離的項目,是不是可以把跳轉路由的問題直接扔給前端。
后面還有七個:configureViewResolvers、addArgumentResolvers、addReturnValueHandlers、configureMessageConverters、extendMessageConverters、configureHandlerExceptionResolvers、extendHandlerExceptionResolvers。是在用的太少了,就不再看了。
package org.springframework.web.servlet.config.annotation; /** * 篇幅原因,我們先只介紹Spring mvc常用的一些方法 */ public interface WebMvcConfigurer { void addFormatters(FormatterRegistry registry); void configureMessageConverters(List<HttpMessageConverter<?>> converters); void extendMessageConverters(List<HttpMessageConverter<?>> converters); Validator getValidator(); /* 配置內容裁決的一些選項*/ void configureContentNegotiation(ContentNegotiationConfigurer configurer); void configureAsyncSupport(AsyncSupportConfigurer configurer); /* @since 4.0.3 */ void configurePathMatch(PathMatchConfigurer configurer); /*參數解析*/ void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers); /*返回值解析*/ void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers); /*異常處理*/ void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers); void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers); void addInterceptors(InterceptorRegistry registry); MessageCodesResolver getMessageCodesResolver(); void addViewControllers(ViewControllerRegistry registry); /** * 這里配置視圖解析器 */ void configureViewResolvers(ViewResolverRegistry registry); /** *靜態資源處理 */ void addResourceHandlers(ResourceHandlerRegistry registry); void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer); void addCorsMappings(CorsRegistry registry); }