SpringBoot自动配置MVC原理

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

https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#using-boot
在这里插入图片描述
写着SpringBoot自动配置了SpringMVC,支持两种视图解析器ContentNegotiatingViewResolver ,
BeanNameViewResolver ,
,巴拉巴拉的

我们去看看他是如何实现ContentNegotiatingViewResolver 的
在这里插入图片描述

他实现了视图解析器接口,接口中就一个方法,看他是怎么重写的在这里插入图片描述
在这里插入图片描述
获取视图解析器列表,找到best视图解析器,并且返回
进入getCandidateViews这个方法看看他是如何获取解析器列表的
在这里插入图片描述
拿到列表,遍历一遍,候选视图加入列表
在这里插入图片描述
返回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。试试去
在这里插入图片描述
实现了个视图解析器并且塞进了bean,直接去DispatchServlet打个断点看下
在这里插入图片描述
在这里插入图片描述
可以看到前两个是他自带的视图解析器,第三个是模板自带的(这就是为啥添加模板后直接返回值就行了,默认会给到模板的解析器然后解析输出),第四个就是我们写的。完成了自定义配置

皮一下,官方文档说不能加@EnableWebMvc
我不!
在这里插入图片描述
这个注解里面只是引入了一个配置类
我们回到DispatchServlet去看看发生了什么

在这里插入图片描述

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


版权声明:本文为Changed117原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。