SpringBoot自动配置MVC原理

SpringBoot自动配置了MVC究竟都配置了那些东西,该如何自定义呢?
摸了!直接看官方文档(其实我也看不大懂英语)

https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#using-boot
SpringBoot自动配置MVC原理
写着SpringBoot自动配置了SpringMVC,支持两种视图解析器ContentNegotiatingViewResolver ,
BeanNameViewResolver ,
,巴拉巴拉的

我们去看看他是如何实现ContentNegotiatingViewResolver 的
SpringBoot自动配置MVC原理

他实现了视图解析器接口,接口中就一个方法,看他是怎么重写的SpringBoot自动配置MVC原理
SpringBoot自动配置MVC原理
获取视图解析器列表,找到best视图解析器,并且返回
进入getCandidateViews这个方法看看他是如何获取解析器列表的
SpringBoot自动配置MVC原理
拿到列表,遍历一遍,候选视图加入列表
SpringBoot自动配置MVC原理
返回best视图解析器

然后看这个
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的默认配置并且添加配置,你就得实现WebMvcConfigurer 并且加上@Configuration但是不能加@EnableWebMvc。试试去
SpringBoot自动配置MVC原理
实现了个视图解析器并且塞进了bean,直接去DispatchServlet打个断点看下
SpringBoot自动配置MVC原理
SpringBoot自动配置MVC原理
可以看到前两个是他自带的视图解析器,第三个是模板自带的(这就是为啥添加模板后直接返回值就行了,默认会给到模板的解析器然后解析输出),第四个就是我们写的。完成了自定义配置

皮一下,官方文档说不能加@EnableWebMvc
我不!
SpringBoot自动配置MVC原理
这个注解里面只是引入了一个配置类
我们回到DispatchServlet去看看发生了什么

SpringBoot自动配置MVC原理

你会发现他默认配置的解析器飞了。所以是怎么做到的呢?回到WebMvcAutoConfiguration去看下源码(因为那个Boot默认的视图解析器是在这里面创建的)
SpringBoot自动配置MVC原理
这个注解就是当WebMvcConfigurationSupport这个Bean存在的时候这个类就失效了我们打开之前那个
@EnableWebMvc注解看下里面导入的是什么
SpringBoot自动配置MVC原理
导入的这个类继承了WebMvcConfigurationSupport所以默认配置失效,所以官方文档不让你加这个注解。