参考文档

1,Spring MVC自动配置

Spring Boot自动配置好了Spring MVC

以下是SpringBoot对SpringMVC的默认配置(WebMvcAutoConfiguration)

  • Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.
    • 自动配置了ViewResolver(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发和重定向))
    • ContentNegotiatingViewResolver :组合所有的视图解析器的
    • 可以自定义一个视图解析器给容器,自动的将其组合进来。
  • Support for serving static resources, including support for WebJars (see below). 静态资源文件夹路径,webjars。
  • Static index.html support. 静态首页访问
  • Custom Favicon support (see below). favicon.ico 图标设置
  • 自动注册了 Converter , GenericConverter , Formatter beans.
    • Converter:转换器。类型转换器使用Converter,如public String hello(User user)。
    • Formatter :格式化器。2017.12.17时间字符串转换为Date类型 
@Bean
@ConditionalOnProperty(prefix = "spring.mvc", name = "date‐format")
//在文件中配置日期格式化的规则
public Formatter<Date> dateFormatter() {
       return new DateFormatter(this.mvcProperties.getDateFormat());//日期格式化组件
}

 自定义的格式化转换器,只需要放在容器中即可。

  • Support for HttpMessageConverters (see below).
    • HttpMessageConverter:SpringMVC用来转换http请求和响应的。对象和json字符串之间的转换。
    • HttpMessageConverters 是容器中确定获取所有的HttpMessageConverter。

自定义给容器中添加HttpMessageConverter,只需要将自己的组件注册到容器中(@Bean @Component)

  • Automatic registration of MessageCodesResolver (see below). 定义错误代码生成规则
  • Automatic use of a ConfigurableWebBindingInitializer bean (see below).

可以配置一个ConfigurableWebBindingInitializer来替换默认的(添加到容器)。

初始化WebDataBinder;
请求数据=====JavaBean;

org.springframework.boot.autoconfigure.web:web的所有自动场景

2,扩展SpringMVC

编写一个配置类(@configuration),实现接口implements WebMvcConfigurer 和继承类extends WebMvcConfigurationSupport 不能标注@EnableWebMvc。以前的版本是extends WebMvcConfigurerAdapter。

但是WebMvcConfigurationSupport只有SpringMVC的基本功能,所以扩展的话最好还是实现WebMvcconfigurer接口。

//使用WebMvcConfigurer可以来扩展SpringMVC的功能
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //浏览器发送/done 请求来到success
        registry.addViewController("/done").setViewName("success");
    }
}

原理:

1)WebMvcAutoConfiguration是SpringMVC的自动配置类

2)在做其他自动配置时会导入:@Import(EnableWebMvcConfiguration.class)

@Configuration
public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration {
    private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
    //从容器中获取所有的WebMvcConfigurer
    @Autowired(required = false)
    public void setConfigurers(List<WebMvcConfigurer> configurers) {
        if (!CollectionUtils.isEmpty(configurers)) {
            this.configurers.addWebMvcConfigurers(configurers);
            //一个参考实现;将所有的WebMvcConfigurer相关配置都来一起调用;
            //@Override
            // public void addViewControllers(ViewControllerRegistry registry) {
            // for (WebMvcConfigurer delegate : this.delegates) {
           // delegate.addViewControllers(registry);
            // }
        }
    }
}

3)容器中所有的WebMvcConfigurer都会一起起作用

4)自定义的配置类也会被调用

效果:SpringMVC的自动配置和扩展配置都会起作用。

3,全面接管SpringMVC

SpringBoot对SpringMVC的自动配置不需要了,所有都是自己配置,所有的SpringMVC的自动配置都实现。

直接extends WebMvcConfigurationSupport 

@Configuration
public class MyWebConfig extends WebMvcConfigurationSupport {

}

因为MywebConfig继承了WebMvcConfigurationSupport ,然后放到容器中,而导入的WebMvcConfigurationSupport 只有SpringMVC的基本功能。

@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
//容器中没有这个组件的时候,这个自动配置类才生效
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {

4,修改SpringBoot的默认配置

1)SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置的;如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来。

2)在SpringBoot中会有非常多的XXXConfigurer帮助我们进行扩展配置

3)在SpringBoot中会有很多的XXXCustomizer帮助我们进行定制配置。

 

 posted on 2020-11-28 18:57  会飞的金鱼  阅读(221)  评论(0)    收藏  举报