大家從網上及源碼注釋上查到的解釋是,在spring中配置WebMvc時有兩種方法,一種是繼承WebMvcConfigurationSupport,重寫里面相應的方法,還有一種是繼承WebMvcConfigurer的子抽象類WebMvcConfigurerAdapter,也是重寫里面相應的方法,但是需要在配置類上添加@EnableWebMvc注解。那這兩個類直接是什么關系呢?
細心的開發者會發現,WebMvcConfigurationSupport中那些子類可以重寫的空方法在WebMvcConfigurer都有,這說明WebMvcConfigurer只是WebMvcConfigurationSupport的一個擴展類,它並沒有擴展新功能,只是為讓用戶更方便安全的添加自定義配置,為什么說是安全呢?因為如果直接繼承WebMvcConfigurationSupport,那么用戶可以重寫默認的配置,如果對原理不是很清楚地開發者不小心重寫了默認的配置,springmvc可能相關功能就無法生效,是一種不安全的行為。但如果是繼承WebMvcConfigurerAdapter,那么開發者是在默認配置的基礎上添加自定義配置,相對來說更安全一些,只不過要多加一個@EnableWebMvc注解。從這個角度來說,最佳實踐還是繼承WebMvcConfigurerAdapter,如下
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { //添加自定義攔截器 registry.addInterceptor(); } }
網上說WebMvcConfigurerAdapter已經標記為過時,我目前用的是4.3.10版本還沒有這個標識
-
為什么WebMvcConfigurer實現要加@EnableWebMvc
@EnableWebMvc注解類上導入了DelegatingWebMvcConfiguration類,該類是WebMvcConfigurationSupport的子類,該類除了實例化WebMvcConfigurationSupport實例以外,另一個作用就是收集BeanFactory中所有WebMvcConfigurer的實現,匯集到WebMvcConfigurerComposite中,在WebMvcConfigurationSupport實例化過程中會分別調用這些實現,將相應的實例傳入這些實現中,供開發者在此基礎上添加自定義的配置。這也就是在WebMvcConfigurerAdapter子類上要加@EnableWebMvc的原因,因為要先實例化WebMvcConfigurationSupport。 -
為什么可以存在多個WebMvcConfigurer的實現?
一般來講一個應用中一個WebMvcConfigurer的已經足夠,設計成收集多個是不是有些多余?從springboot的autoconfigure機制來看並不多余,反而更靈活,比如我要寫一個mybatis的AutoConfiguration和JPA的AutoConfiguration,我就可以在不同的AutoConfiguration里面定義一個WebMvcConfigurer的實現,里面只配置與mybatis或JPA相關的配置,這樣需要那個啟用那個,不需要人工通過注釋代碼來轉換mybatis和JPA,注意:在springboot下自定義的WebMvcConfigurer實現配置類上是不需要添加@EnableWebMvc的,因為springboot已經實例化了WebMvcConfigurationSupport,如果添加了該注解,默認的WebMvcConfigurationSupport配置類是不會生效的,也就是以用戶定義的為主,一般建議還是不覆蓋默認的好。