美文网首页从零开始学习SpringBoot
SpringBoot - SpringMVC自动配置以及原理

SpringBoot - SpringMVC自动配置以及原理

作者: BzCoder | 来源:发表于2018-05-14 15:36 被阅读61次

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

    一.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自动配置以及原理

        本文链接:https://www.haomeiwen.com/subject/qqjzrftx.html