springboot源碼-springmvc之WebMvcConfigurer

           springboot2.0以後推薦實現WebMvcConfigurer去更改springmvc的配置。不建議直接繼承WebMvcConfigurationSupport的方式去更改配置。

        WebMvcConfigurer是一個接口類 並且裏面的方法利用jdk8的特性全部給了默認的空實現,所以springboot不建議使用WebMvcConfigurerAdapter。那我們實現了WebMvcConfigurer的某個方法爲什麼會完成配置呢。我們先看一下WebMvcAutoConfiguration。

@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
		ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
  
	@Configuration
	public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration {
   }
}

     簡單看一下這個類的定義 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) 在缺失 WebMvcConfigurationSupport的實例完成創建 所以當我們系統中通過繼承WebMvcConfigurationSupport來完成配置 那麼springboot將不再爲我們springmvc提供auto-config。

    再看一下DelegatingWebMvcConfiguration 這個類  我們發現這個類最終會繼承WebMvcConfigurationSupport 來實現配置。

打開DelegatingWebMvcConfiguration的部分源碼

@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
	private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
	@Autowired(required = false)
	public void setConfigurers(List<WebMvcConfigurer> configurers) {
		if (!CollectionUtils.isEmpty(configurers)) {
			this.configurers.addWebMvcConfigurers(configurers);
		}
	}
}

可以發現WebMvcConfigurerComposite繼承WebMvcConfigurer  並且擁有一個屬性List<WebMvcConfigurer> delegates  這個屬性會在DelegatingWebMvcConfiguration類中 裝載系統所有的WebMvcConfigurer實例。而DelegatingWebMvcConfiguration繼承了WebMvcConfigurationSupport  實現了部分功能。

@Override
	protected void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
		this.configurers.addReturnValueHandlers(returnValueHandlers);
	}

	@Override
	protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
		this.configurers.configureMessageConverters(converters);
	}

	@Override
	protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
		this.configurers.extendMessageConverters(converters);
	}

	@Override
	protected void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
		this.configurers.configureHandlerExceptionResolvers(exceptionResolvers);
	}

	@Override
	protected void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
		this.configurers.extendHandlerExceptionResolvers(exceptionResolvers);
	}

所以這就是爲什麼我們實現WebMvcConfigurer接口 就會對springmvc完成設置的原因。 最終還是藉助WebMvcConfigurationSupport 去實現配置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章