springboot为SpringMVC配置了自动配置,以下是SpringBoot对SpringMVC的默认配置
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
自动配置在Spring的默认配置之上添加了以下功能
- 包含
ContentNegotiatingViewResolver
和BeanNameViewResolver
。--> 视图解析器 - 支持服务静态资源,包括对WebJars的支持(官方文档中有介绍)。--> 静态资源文件夹路径
- 自动注册
Converter
,GenericConverter
和Formatter
beans。--> 转换器,格式化器 - 支持
HttpMessageConverters
(官方文档中有介绍)。--> SpringMVC用来转换Http请求和响应的; - 自动注册
MessageCodesResolver
(官方文档中有介绍)。--> 定义错误代码生成规则 - 静态
index.html
支持。--> 静态首页访问 - 定制
Favicon.ioc
支持(官方文档中有介绍)。--> 网站图标 - 自动使用
ConfigurableWebBindingInitializer
bean(官方文档中有介绍)。
如果您想保留 Spring Boot MVC 的功能,并且需要添加其他 MVC 配置(拦截器,格式化程序和视图控制器等),可以添加自己的 WebMvcConfigurer
类型的 @Configuration
类,但不能带 @EnableWebMvc
注解。如果您想自定义 RequestMappingHandlerMapping
、RequestMappingHandlerAdapter
或者 ExceptionHandlerExceptionResolver
实例,可以声明一个 WebMvcRegistrationsAdapter
实例来提供这些组件。如果您想完全掌控 Spring MVC,可以添加自定义注解了 @EnableWebMvc
的 @Configuration 配置类。
视图解析器
视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?)
- 自动配置了ViewResolver
- ContentNegotiatingViewResolver:组合所有的视图解析器的;
转换器/格式化器
Converter
:转换器; public String hello(User user):类型转换使用Converter(表单数据转为user)Formatter
格式化器; 2017.12.17===Date;
@Bean
//在配置文件中配置日期格式化的规则
@ConditionalOnProperty(prefix = "spring.mvc", name = "date-format")
public Formatter<Date> dateFormatter() {
return new DateFormatter(this.mvcProperties.getDateFormat());//日期格式化组件
}
自己添加的格式化器转换器,我们只需要放在容器中即可
HttpMessageConverters
HttpMessageConverter
:SpringMVC用来转换Http请求和响应的;User---Json;HttpMessageConverters
是从容器中确定;获取所有的HttpMessageConverter;-
自己给容器中添加HttpMessageConverter,只需要将自己的组件注册容器中(@Bean,@Component)
MessageCodesResolver
我们可以配置一个ConfigurableWebBindingInitializer来替换默认的;(添加到容器)
扩展SpringMVC
- 先前的配置文件的配置
<mvc:view-controller path="/hello" view-name="success"/>
- 使用配置类(@Configuration)是WebMvcConfigurer类型,不能标注@EnableWebMvc
@Configuration public class MyMvcConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/hi").setViewName("success"); } }
如何修改SpringBoot的默认配置
SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如果有就用户配置的,如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来;
- 在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置
- 在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置