SpringBoot - SpringMVC自动配置以及原理

双休日过了,学习继续。不学习的人生有什么意义!

一.Spring MVC 自动配置

查阅SpringBoot官方文档,SpringBoot帮我们自动配置了以下组件。

  • Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.
    1. 自动配置了ViewResovler(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?)
    2. ContentNegotiatingViewResolver:组合所有的视图解析器
    3. 如何定制:我们给容器添加一个视图解析器,它就会自动的组合起来
  • Support for serving static resources, including support for WebJars (covered later in this document)).
    1. 静态资源文件路径webjars
  • Automatic registration of Converter, GenericConverter, and Formatter beans.
    1. Converter:转换器:类型转换组件。
    2. Formatter 格式化:2018.5.10 ==Date;
  • Support for HttpMessageConverters (covered later in this document).
    1. HttpMessageConverters:SpringMVC用来转换Http请求和响应的;User-json
    2. 是从容器中确定;获取所有的 HttpMessageConverters;如果要定义的话,就把自己的组件注册到容器中。
  • Automatic registration of MessageCodesResolver (covered later in this document).
    1. MessageCodesResolver:定义错误代码生成规则
  • Static index.html support.
  • Custom Favicon support (covered later in this document).
  • Automatic use of a ConfigurableWebBindingInitializer bean (covered later in this document).
    1. ConfigurableWebBindingInitializer :Web数据绑定器,请求数据绑定到JavaBean中。如果没有自定绑定器,它会调用默认的绑定器。

模式小结

  1. SpringBoot在自动配置很多组件的时候,都会先判断用户有没有自己配置(@Bean,@Component),如果有,就使用用户的配置,没有就自动配置。但是有些组件可以有多个(ViewResolver),那么SpringBoot就将用户配置和自己默认的配置组合起来。

二.如何修改SpringBoot的默认配置

1.添加修改SpringBoot的默认配置

官方文档原文:
If you want to keep Spring Boot MVC features and you want to add additional MVC configuration (interceptors, formatters, view controllers, and other features), you can add your own @Configuration class of type WebMvcConfigurer but without @EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter, or ExceptionHandlerExceptionResolver, you can declare a WebMvcRegistrationsAdapter instance to provide such components.

解释一下,就是假如你需要扩展配置SpringBoot的话,你只需要创建一个配置类继承,给这个类添加 @Configuration 标注,并继承WebMvcConfigurer ,并且不能有@EnableWebMvc。或者申明一个WebMvcRegistrationsAdapter实例并且将其加入到容器当中。

以下为一种添加配置的示例:

/**
 * @author BaoZhou
 * @date 2018/5/14
 */
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //浏览器请求/baozhou,映射到success
        registry.addViewController("/baozhou").setViewName("success");
    }
}

原理:
我们的扩展配置类会和自动配置类放入同一个容器,SpringBoot在装载配置的时候,会将所有配置都取出,所以我们的配置和SpringBoot都会生效。当然,以上代码只是对WebMvc的扩展配置,其他配置可以参考以上模式,只要找到相对应的XXXconfigurer接口进行实现即可。

2.全面托管SpringBoot的默认配置(几乎不用)

继续官方文档:
If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc.

解释,假如我们要完全自己配置SpringMVC,我只要在我们的配置文件上添加@EnableWebMvc,就可以做到完全托管。实际工作中基本不会用到,但是这里也是通过阅读源码加深下对于SpringBoot的实现方式的理解。
原理:
此处我们看一下源码:

@EnableWebMvc :

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}

WebMvcAutoConfiguration:

@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class) //这句很重要
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
        ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {

我们再来看下DelegatingWebMvcConfiguration.class

public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {

正是因为@EnableWebMvc导入了WebMvcConfigurationSupport,所以就导致了WebMvcAutoConfiguration的失效。

3.小结

有关于 SpringMVC自动配置以及原理就学习到这里,喜欢的可以点一个赞!

你可能感兴趣的:(SpringBoot - SpringMVC自动配置以及原理)