【7】SpringBoot的SpringMVC自动配置

SpringBoot的SpringMVC自动配置

    • 一、官方文档
    • 二、Spring MVC auto-configuration
    • 三、扩展SpringMVC
    • 二、如何修改SpringBoot的默认配置

一、官方文档

点击查看官方文档(2.2.6)

二、Spring MVC auto-configuration

Spring Boot为Spring MVC提供了大多数场景下的自动配置,以下是Spring Boot对Spring MVC的默认配置:

  • 包含了 ContentNegotiatingViewResolver and BeanNameViewResolver beans.
    • 自动配置了ViewResolver(视图解析器),根据方法的返回值得到视图对象(View),视图对象决定如何渲染,转发还是重定向
    • ContentNegotiatingViewResolver作用:组合所有的视图解析器的;
    • 如需定制视图解析器,可以自己给容器中添加一个视图解析器,SpringBoot将自动把它组合进来。
  • 支持为静态资源提供服务,包括对webjar的支持
  • 静态首页访问的支持
  • 自定义的Favicon支持
  • 自动注册了Converter, GenericConverter, Formatter beans.
    • Converter:类型转换器
    • Formatter:格式化器,如将字符串’2017.12.17’转化为Date类型
  • 支持HttpMessageConverters
    • HttpMessageConverters:SpringMvc用来转换http请求和响应的转换器
    • HttpMessageConverters 是从容器中获取所有的HttpMessageConverter,如果
    • 如需定制HttpMessageConverter,可以自己给容器中添加HttpMessageConverter,只需要将自己的组件注册到容器中(@Bean,@Component)
  • MessageCodesResolver的自动注册:用于定义错误代码的生成规则

三、扩展SpringMVC

如果发送的请求不想通过controller,只想直接地跳转到目标页面,这时候就可以使用mvc:view-controller标签;
如果想通过定义URL来进行路径请求拦截,可以做到较为细粒度的拦截控制,这时候就可以使用mvc:interceptors标签:

<mvc:view-controller path="/hello" view-name="success"/>
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/hello"/>
            <bean>...bean>
        mvc:interceptor>
    mvc:interceptors>

但是使用了springBoot后,没有了springmvc的配置文件,SpringBoot也提供了相应的扩展。

如果想要保留Spring Boot对SpringMVC自动配置的功能,且我们自己想要的其他MVC配置(拦截器interceptors,格式化处理器Formatter,视图控制器等ViewResolver等)。

SpringBoot 1.xSpringBoot 2.x存在区别

  • SpringBoot 1.x可以添加继承于WebMvcConfigurationadpter类型的@Configuration类,而不需要注解@EnableWebMvc。该配置中的默认配置和扩展配置,是同时允许的。
  • SpringBoot 2.x可以添加继承于WebMvcConfigurationSupport类型的@Configuration类,而不需要注解@EnableWebMvc。该配置默认会覆盖 Spring boot的自动配置,导致配置失效静态资源无法访问
  • 详细参考:点击查看

SpringBoot 1.x

/*
SpringBoot 1.x版本,springmvc扩展配置
*/
@Configuration
public class MyMvcConfig extends WebMvcConfigurationadpter{
	//拓展springmvc视图映射
	//注意:使用了该配置,会使“欢迎页配置”失效,即"/**"的默认配置失效
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //浏览器发送 /test请求来到 success页面
        registry.addViewController("/test").setViewName("success");
    }
}

SpringBoot 2.x

/*
SpringBoot 2.x版本,springmvc扩展配置
*/
@Configuration
public class MyMvcConfig extends WebMvcConfigurationSupport {
	/**
     * 资源路径映射
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/resources/")
                .addResourceLocations("classpath:/static/")
                .addResourceLocations("classpath:/templates/")
                .addResourceLocations("classpath:/public/");
        /**
         * 支持webjars
         */
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
        /**
         * 支持swagger
         */
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        super.addResourceHandlers(registry);
    }
}

如果想全面控制Spring MVC,你可以添加自己的@Configuration,并使用@EnableWebMvc注解,SpringBoot对Springmvc自动配置都失效(不推荐)


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

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

你可能感兴趣的:(SpringBoot)