SpringMVC自动配置

1.SpringBoot官方文档对SpringMVC的默认配置:

  • Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.

    • 自动配置了ViewResolver(视图解析器:根据方法返回值得到视图对象,试图对象决定如何渲染)
    • ContentNegotiatingViewResolver组合所有的视图解析器
    • 如何定制:我们可以给自己的容器添加一个视图解析器,自动的将其组合进来
  • Support for serving static resources, including support for WebJars (covered later in this document)).

    • 静态资源文件夹路径,webjars
  • Automatic registration of Converter, GenericConverter, and Formatter beans.

    • 自动注册了

    • Converter 类型转换器 :String ===> 封装进去User

    • Formatter 格式化器 :2017-12-17 ===> Date

      public void addFormatters(FormatterRegistry registry) {
      ApplicationConversionService.addBeans(registry, this.beanFactory);
      }
      public static void addBeans(FormatterRegistry registry, ListableBeanFactory beanFactory) {
      Set<Object> beans = new LinkedHashSet();
      beans.addAll(beanFactory.getBeansOfType(GenericConverter.class).values());
      beans.addAll(beanFactory.getBeansOfType(Converter.class).values());

      所以springboot同时也将容器中所有的Converter Formatter GenericConverter加入到组件中

      自己添加的格式化转换器,我们只需要放在容器中即可

  • Support for HttpMessageConverters (covered later in this document).

    • HttpMessageConverters : SpringMVC用来转换Http请求和相应的;(User对象转换成Json数据)

    • 只有一个构造器给ObjectProvider赋值 ,所以参数直接从容器中获取, HttpMessageConverters 是从容器中确定,获取所有的HttpMessageConverter

      private final ObjectProvider<HttpMessageConverters> messageConvertersProvider;
      public WebMvcAutoConfigurationAdapter(…… ObjectProvider<HttpMessageConverters> messageConvertersProvider…………) {
      this.messageConvertersProvider = messageConvertersProvider;

      自己添加的HttpMessageConverter,只需要直接放入容器(@Bean、@Component)

  • Automatic registration of MessageCodesResolver (covered later in this document).

    • 定义错误代码的生成规则
  • Static index.html support.

    • 静态首页访问
  • Custom Favicon support (covered later in this document).

    • favicon.ico
  • Automatic use of a ConfigurableWebBindingInitializer bean (covered later in this document).

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

       初始化WebDataBinder
      请求数据===JavaBean 将数据绑定成为我们要封装的对象,用到类型转换器,格式化器等等
      ConfigurableWebBindingInitializer
      public void initBinder(WebDataBinder binder) {
      binder.setAutoGrowNestedPaths(this.autoGrowNestedPaths);
      if (this.directFieldAccess) {
      binder.initDirectFieldAccess();
      }

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

2. 扩展SpringMVC

If you want to keep those Spring Boot MVC customizations and make more MVC customizations (interceptors, formatters, view controllers, and other features), you can add your own @Configuration class of type WebMvcConfigurer but without @EnableWebMvc.

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

编写一个配置类(Configuration),是WebMvcConfigurer 类型,不能标注@EnableWebMvc

@Configuration
//WebMvcConfigurer接口中有很多方法的对应的是以往Springmvc配置文件中的属性
//使用其来扩展SpringMVC的功能
public class MyMvcConfig implements WebMvcConfigurer { @Override
public void addViewControllers(ViewControllerRegistry registry) {
//浏览器发送/jiat请求来到 success
registry.addViewController("/jiat").setViewName("success");
} }

原理:

  1. WebMvcAutoConfiguration是SpringMVC的自动配置类
  2. 在做其他自动配置时会导入;@Import(EnableWebMvcConfiguration.class)
  3. 容器中所有的WebMvcConfiguration都会起作用
  4. 我们的配置类也会被调用

3.全面接管SpringMVC(在我们的WebMvcConfigurer配置类上加上一个@EnableWebMvc)

SpringBoot对SpringMVC的自动配置不需要了,所有都是我们自己配置,所有的SpringMVC模块自动配置全部失效,包括静态资源

@EnableWebMvc能使默认配置生效的原因

  1. 添加了@EnableWebMvc后会为容器导入一个WebMvcConfigurationSupport配置类,添加相应组件到容器中
@Import({DelegatingWebMvcConfiguration.class}) //导入一个DelegatingWebMvcConfiguration
public @interface EnableWebMvc {
//为容器添加一个WebMvcConfigurationSupport
@Configuration(
proxyBeanMethods = false
)
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
  1. 而 WebMvcAutoConfiguration 的注解上有一个“@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})”,当存在如果容器中存在WebMvcConfigurationSupport对象时,WebMvcAutoConfiguration 自动配置失效
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnWebApplication(
type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
//如果容器中存在WebMvcConfigurationSupport对象,则以下所有配置不生效
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {

接管SpringMVC总结

  1. @EnableWebMvc将WebMvcConfigurationSupport组件导入容器中
  2. WebMvcConfigurationSupport只是SpringMVC的最基本功能
  3. 用户可以在实现基本功能的WebMvcConfigurationSupport上定制自己的webmvc

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

模式:

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

SpringBoot--SpringMVC自动配置的更多相关文章

  1. spring-boot spring-MVC自动配置

    Spring MVC auto-configuration Spring Boot 自动配置好了SpringMVC 以下是SpringBoot对SpringMVC的默认配置:==(WebMvcAuto ...

  2. SpringBoot源码学习系列之SpringMVC自动配置

    目录 1.ContentNegotiatingViewResolver 2.静态资源 3.自动注册 Converter, GenericConverter, and Formatter beans. ...

  3. SpringBoot扩展SpringMVC自动配置

    SpringBoot中自动配置了 ViewResolver(视图解析器) ContentNegotiatingViewResolver(组合所有的视图解析器) 自动配置了静态资源文件夹.静态首页.fa ...

  4. 【SpringBoot】SpringBoot与SpringMVC自动配置(五)

    本文介绍SpringBoot对Spring MVC自动配置,SpringBoot自动配置原理可以参考:[SpringBoot]SpringBoot配置与单元测试(二) 首先新建一个SpringBoot ...

  5. 9 Web开发——springmvc自动配置原理

    官方文档目录: https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-sp ...

  6. springboot mvc自动配置(三)初始化mvc的组件

    所有文章 https://www.cnblogs.com/lay2017/p/11775787.html 正文 在springboot mvc自动配置的时候,获得了DispatcherServlet和 ...

  7. 关于SpringBoot的自动配置和启动过程

    一.简介 Spring Boot简化了Spring应用的开发,采用约定大于配置的思想,去繁从简,很方便就能构建一个独立的.产品级别的应用. 1.传统J2EE开发的缺点 开发笨重.配置繁多复杂.开发效率 ...

  8. 4_2.springboot2.x配置之springmvc自动配置

    1.Spring MVC auto-configuration 查看官方文档: Spring Boot为Spring MVC提供了自动配置,适用于大多数应用程序. 自动配置在Spring的默认值之上添 ...

  9. springboot08(springmvc自动配置原理)

    MVC WebMvcAutoConfiguration.java @ConditionalOnMissingBean(name = "viewResolver", value = ...

  10. Springboot MVC 自动配置

    Springboot MVC 自动配置 官方文档阅读 https://docs.spring.io/spring-boot/docs/current/reference/html/web.html#w ...

随机推荐

  1. C# 中 枚举Enum 一些转换的方法整理

    工作中 经常遇到枚举 的一些转换  特别是获取枚举备注等  特地整理下 方法以后使用 public void TestMethod1() { TestEnumOne colorEnum = TestE ...

  2. 如何构建一个arm64 AArch64的Ubuntu rootfs

    文章目录 1 下载文件创建rootfs文件夹 2 安装qemu-user-static搭建arm64模拟环境 3 chroot 到 模拟arm64的文件系统下 4 安装基础的软件包 5 系统基础的修改 ...

  3. 【教程】高德地图使用ECharts实现数据可视化

    关于百度地图结合ECharts实现数据可视化的资料已经很多了,毕竟是官方提供支持的,这里就不再赘述.今天我们来讲一下让高德地图与ECharts结合来实现数据可视化图表的展示. 一.ECharts 高德 ...

  4. 通过PAML中的CODEML模块计算dnds的过程以及踩坑

    最近帮女朋友做毕业设计的时候用到了 PAML这个软件的codeml功能,发现网上相关的资料很少,于是把自己踩的一些坑分享一下,希望能帮到其他有相同困难的人 一.下载与安装 PAML软件下载地址 htt ...

  5. Print输出颜色字体方法

    书写格式:     开头部分:\033[显示方式;前景色;背景色m + 结尾部分:\033[0m      注意:开头部分的三个参数:显示方式,前景色,背景色是可选参数,可以只写其中的某一个:另外由于 ...

  6. java ->包的声明与访问

    包的声明与访问 包的概念 java的包,其实就是我们电脑系统中的文件夹,包里存放的是类文件. 当类文件很多的时候,通常我们会采用多个包进行存放管理他们,这种方式称为分包管理. 在项目中,我们将相同功能 ...

  7. JavaScript之ES5的继承

    自从有了ES6的继承后,ES5的继承也退出了舞台,在实际开发也不会用得着: 先看看ES6的继承 class Father{ constructor(a){ console.log(a); } play ...

  8. 黑马程序员_毕向东_Java基础视频教程——if 语句(单条语句)(随笔)

    if 语句(单条语句) 格式(三种) [注意]:如果 if 控制的语句只有一条,则 这个 { } 括号可以不写 if (条件表达式) { 执行语句; } class Test{ public stat ...

  9. Antd 表格数据分页展示

    分页组件代码 render(){ const {total,size,currenPage} = this.state // 参数分别为数据总条数.每页数据条数.当前页页码 return ( // 渲 ...

  10. 剑指Offer02之替换空格

    剑指Offer02之替换空格 题目描述 实现一个方法,将输入的字符串中的空格替换成%20. 例子如下 hello world --> hello%20world 代码实现 //方法一 采用Jav ...