一、SpringMVC autoConfiguration

Spring Boot默认自动配置了SprignMVC,官网说明地址,主要部分如下:
Spring MVC自动配置与拓展 - 图1
翻译说明
Spring MVC自动配置与拓展 - 图2

Spring Boot对SpringMVC的默认配置(WebMvcAutoConfiguration):

  1. Inclusion of ContentNegotiatingViewResolverand BeanNameViewResolverbeans.

自动配置了ViewResolver(视图解析器:根据方法的返回值得到视图对象 View,视图对象决定如何渲染该返回值)。 ContentNegotiatingViewResolver:组合所有的视图解析器。我们可以向容器中添加定制的视图解析器,该对象会自动将其组合进来。

  1. Support for serving static resources, including support for WebJars (see below).

支持静态资源文件夹,包括 WebJars。

  1. Staticindex.htmlsupport.

静态首页访问。

  1. Custom Faviconsupport (see below).

favicon.ico 图标

  1. Automatic registration of ConverterGenericConverter and Formatter beans.

Converter:转换器,用于类型转换。 Formatter:时间对象格式化器。 我们自己添加的格式化器转换器,我们只需要放在容器中即可。

  1. Support for HttpMessageConverters(see below).

HttpMessageConverters:从容器中注入,获取HttpMessageConverter。 HttpMessageConverter:SpringMVC用来转换Http请求和响应参数格式的。 我们也可以向容器中添加定制的HttpMessageConverter,只需要将自己的组件注册到容器中。

  1. Automatic registration of MessageCodesResolver (see below).

定义错误代码生成规则。

  1. Automatic use of a ConfigurableWebBindingInitializerbean (see below).

初始化WebDataBinder

二、扩展SpringMVC

方式一

  1. <mvc:view-controller path="/hello" view-name="success"/>
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <mvc:mapping path="/hello"/>
  5. <bean></bean>
  6. </mvc:interceptor>
  7. </mvc:interceptors>

方式二
编写一个配置类(@Configuration),返回类型为WebMvcConfigurerAdpter。
注意:不能标注@EnableWebMvc,这样既保留了所有的自动配置,也能用我们拓展的配置。

  1. // 使用WebMvcConfigurerAdapter可以来扩展SpringMVC的功能
  2. @Configuration
  3. public class MyMvcConfig extends WebMvcConfigurerAdapter {
  4. @Override
  5. public void addViewControllers(ViewControllerRegistry registry) {
  6. // 浏览器发送 /atguigu 请求来到 success
  7. registry.addViewController("/atguigu").setViewName("success");
  8. }
  9. }

原理:

  1. WebMvcAutoConfiguration是SpringMVC的自动配置类。
  2. 在做其他自动配置时,会导入 @Import(EnableWebMvcConfiguration.class)
  3. 容器中的所有WebMvcConfigurer都会一起起作用,我们的配置类也会被调用。
    1. @Configuration
    2. public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration {
    3. private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
    4. // 从容器中获取所有的WebMvcConfigurer
    5. @Autowired(required = false)
    6. public void setConfigurers(List<WebMvcConfigurer> configurers) {
    7. if (!CollectionUtils.isEmpty(configurers)) {
    8. this.configurers.addWebMvcConfigurers(configurers);
    9. // 一个参考实现;将所有的WebMvcConfigurer相关配置都来一起调用;
    10. @Override
    11. public void addViewControllers(ViewControllerRegistry registry) {
    12. for (WebMvcConfigurer delegate : this.delegates) {
    13. delegate.addViewControllers(registry);
    14. }
    15. }
    16. }
    17. }

三、全面接管SpringMVC

Spring Boot对SpringMVC的自动配置不需要了,所有都是我们自己配置。
所有的SpringMVC的自动配置都失效,我们需要在配置类中添加@EnableWebMvc即可。

  1. // 使用WebMvcConfigurerAdapter可以来扩展SpringMVC的功能
  2. @EnableWebMvc
  3. @Configuration
  4. public class MyMvcConfig extends WebMvcConfigurerAdapter {
  5. @Override
  6. public void addViewControllers(ViewControllerRegistry registry) {
  7. // 浏览器发送 /atguigu 请求来到 success
  8. registry.addViewController("/atguigu").setViewName("success");
  9. }
  10. }

为什么使用@EnableWebMvc注解,Spring Boot的MVC自动配置就失效了?

  1. // 删除Spring Boot WebMVC自动配置
  2. @Import(DelegatingWebMvcConfiguration.class)
  3. public @interface EnableWebMvc {
  4. @Configuration
  5. public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
  6. @Configuration
  7. @ConditionalOnWebApplication
  8. @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class })
  9. // 容器中没有这个组件的时候,这个自动配置类才生效
  10. @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
  11. @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
  12. @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class })
  13. public class WebMvcAutoConfiguration {

@EnableWebMvc将WebMvcConfigurationSupport组件导入进来。导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能。

四、修改Spring Boot的默认配置

模式:
1、SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置的。如果没有才自动配置,如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来。
2、在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置。
3、在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置。