1. 程式人生 > 程式設計 >繼承WebMvcConfigurationSupport後自動配置不生效及如何配置攔截器

繼承WebMvcConfigurationSupport後自動配置不生效及如何配置攔截器

網上有很多文章說從spring boot2.0之後在構造spring配置檔案時建議推薦直接實現WebMvcConfigurer或者直接繼承WebMvcConfigurationSupport ,經測試實現WebMvcConfigurer是沒問題,但繼承WebMvcConfigurationSupport類是會導致自動配置失效的。

一、繼承WebMvcConfigurationSupport類是會導致自動配置失效的原因

在spring boot的自定義配置類繼承 WebMvcConfigurationSupport 後,發現自動配置的靜態資源路徑(classpath:/META/resources/,classpath:/resources/,classpath:/static/,classpath:/public/)不生效。

首先看一下 自動配置類的定義:

這是因為在 springboot的web自動配置類 WebMvcAutoConfiguration 上有條件註解

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

這個註解的意思是在專案類路徑中 缺少 WebMvcConfigurationSupport型別的bean時改自動配置類才會生效,所以繼承 WebMvcConfigurationSupport 後需要自己再重寫相應的方法。

如果想要使用自動配置生效,又要按自己的需要重寫某些方法,比如增加 viewController ,則可以自己的配置類可以繼承 WebMvcConfigurerAdapter 這個類。不過在spring5.0版本後這個類被丟棄了 WebMvcConfigurerAdapter ,雖然還可以用,但是看起來不好。

這是類上的註釋,意思是spring 5.0後要使用Java8,而在Java8中介面是可以有default方法的,所以這個類就沒必要了。所以我們只需要在自定義配置類中直接實現

二、繼承WebMvcConfigurationSupport類如何配置攔截器的

@Configuration
public class MyConfigurer extends WebMvcConfigurationSupport {
 
@Override
 protected void addInterceptors(InterceptorRegistry registry) {
  registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/emp/toLogin","/emp/login","/js/**","/css/**","/images/**");
  super.addInterceptors(registry);
 }
 
 @Override
 protected void addResourceHandlers(ResourceHandlerRegistry registry) {
  registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
  super.addResourceHandlers(registry);
 }
}

注意這段程式碼:

registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");

由於繼承WebMvcConfigurationSupport後會導致自動配置失效,所以這裡要指定預設的靜態資源的位置。同時要注意不能寫成

registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。