SpringBoot系列——WebMvcConfigurer介紹

在上篇文章中,咱們遇到了接口WebMvcConfigurer。今天就來大概看一下里面的方法都有什麼吧。前端

爲何要使用WebMvcConfigurer?

WebMvcConfigurer是一個接口,提供不少自定義的攔截器,例如跨域設置、類型轉化器等等。能夠說此接口爲開發者提早想到了不少攔截層面的需求,方便開發者自由選擇使用。因爲Spring5.0廢棄了WebMvcConfigurerAdapter,因此WebMvcConfigurer繼承了WebMvcConfigurerAdapter大部份內容。web

WebMvcConfigurer方法介紹

因爲內容太多,只展現3個關鍵的接口,用的比較少的,只是闡述下含義,再也不詳解,用的更少的,就不看了,畢竟十多個方法呢...數據庫

1.configurePathMatch(PathMatchConfigurer configurer)

這個用到的比較少,這個是和訪問路徑有關的。舉個例子,好比說PathMatchConfigurer 有個配置是setUseTrailingSlashMatch(),若是設置爲true的話(默認爲true),後面加個斜槓並不影響路徑訪問,例如「/user」等同於「/user/"。咱們在開發中不多在訪問路徑上搞事情,因此這個方法若是有須要的請自行研究吧。後端

2.configureContentNegotiation(ContentNegotiationConfigurer configurer)

這個東西直譯叫作內容協商機制,主要是方便一個請求路徑返回多個數據格式。ContentNegotiationConfigurer這個配置裏面你會看到MediaType,裏面有衆多的格式。此方法不在多贅述。跨域

3.configureAsyncSupport(AsyncSupportConfigurer configurer)

顧名思義,這是處理異步請求的。只能設置兩個值,一個超時時間(毫秒,Tomcat下默認是10000毫秒,即10秒),還有一個是AsyncTaskExecutor,異步任務執行器。服務器

4.configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)

這個接口能夠實現靜態文件能夠像Servlet同樣被訪問。mvc

5.addFormatters(FormatterRegistry registry)

增長轉化器或者格式化器。這邊不只能夠把時間轉化成你須要時區或者樣式。還能夠自定義轉化器和你數據庫作交互,好比傳進來userId,通過轉化能夠拿到user對象。app

6.addInterceptors(InterceptorRegistry registry)

盼望着,盼望着,你一個經常使用的方法來了。這個方法能夠自定義寫攔截器,並指定攔截路徑。來,我們寫一個攔截器。cors

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。是在用的太少了,就再也不看了。

小結

本篇先大概知道下這些都是什麼方法,最重要的是知道了WebMvcConfigurer爲咱們再攔截層作了一些通用攔截器,方便開發者使用。固然也能夠本身實現攔截器。最經常使用的是仍是六、七、8。其餘的之後有機會研究好了再更新。

相關文章
相關標籤/搜索