环境:Springboot2.4.12
Spring MVC自动配置
Spring Boot为Spring MVC提供了自动配置,可以很好地与大多数应用程序配合使用。
自动配置在Spring默认设置的基础上添加了以下功能:
- 包含 ContentNegotiatingViewResolver 和 BeanNameViewResolver bean 。
- 支持提供静态资源,包括对WebJars的支持(本文档后面会讲到)。
- Converter 、 GenericConverter 和 Formatter bean的自动注册。
- 对 HttpMessageConverters 的支持(本文档后面会讲到)。
- 自动注册 MessageCodesResolver (本文档后面将介绍)。
- 静态 index.html 的支持。
- 自动使用 ConfigurableWebBindingInitializer bean(本文档后面将介绍)。
如果你想保留那些Spring Boot MVC自定义,并做更多的MVC自定义(拦截器、格式化器、视图控制器和其他特性),你可以添加你自己的WebMvcConfigurer类型的@Configuration类,但不需要@EnableWebMvc。
如果你想提供RequestMappingHandlerMapping、RequestMappingHandlerAdapter或ExceptionHandlerExceptionResolver的自定义实例,并且仍然保持Spring Boot MVC自定义,你可以声明一个WebMvcRegistrations类型的bean,并使用它来提供这些组件的自定义实例。
上面这段什么意思?就是我们可以自定义一个Class实现WebMvcRegistrations接口实现自定义的上面的RequestMappingHandlerMapping等相关的类。
WebMvcRegistrations 接口
public interface WebMvcRegistrations {
default RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
return null;
}
default RequestMappingHandlerAdapter getRequestMappingHandlerAdapter() {
return null;
}
default ExceptionHandlerExceptionResolver getExceptionHandlerExceptionResolver() {
return null;
}
}
自动配置中又是如何使用(知道)我们自定义的这个WebMvcRegistrations 类呢?
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(WebProperties.class)
public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {
// 注入自定义的WebMvcRegistrations
private final WebMvcRegistrations mvcRegistrations;
public EnableWebMvcConfiguration(ObjectProvider<WebMvcRegistrations> mvcRegistrations) {
// ...
this.mvcRegistrations = mvcRegistrationsProvider.getIfUnique();
}
}
这里RequestMappingHandlerMapping 为例说明自动配置是如何使用自定义的。接着上面的类中,有如下方法定义。
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(WebPro