Spring 全家桶之 Spring Boot 2.6.4(五)- WebMvcAutoConfiguration(Part D)

简介: Spring 全家桶之 Spring Boot 2.6.4(五)- WebMvcAutoConfiguration(Part D)

四、扩展和修改 Spring Boot Web MVC 配置

Spring Boot官方文档中第 8.1.1. The “Spring Web MVC Framework”小节中提到了如何扩展和完全替代Spring Boot关于Spring Mvc的自动配置

ad127417fa2f499a9a41426d349a65d3_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

扩展Web MVC配置

Spring Boot在自动配置很多组件的时候,先看容器中有没有用户自定义的配置或组件既那些使用@Bean或@Component注解标注的类,如果没有自定义的组件,才会启用自动配置;也可以将用户自定义的组件和自动配置的组件一起发挥作用。

在使用SSM框架进行Spring MVC的配置时,通常都会在Spring MVC的配置文件中进行配置,如果要进行视图映射配置,可以在配置文件中使用mvc命名空间的view-controller标签配置,也可以在配置文件中配置拦截器等。

在Spring Boot中没有Spring MVC配置文件,如何进行这些配置呢?

官网给出了如下答案:

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.

编写一个配置类LilithMvcConfig,使用@Configuration注解,并实现WebMvcConfigurer接口,注意不能标注@EnableWebMVC注解

@Configuration
public class LilithMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        // 浏览器发送 /lilith 页面跳转到success页面
        registry.addViewController("/lilith").setViewName("success");
    }
}
复制代码

重新启动应用,浏览器输入 http://localhost:8080/lilith

cfc0dc0506f6421eae30e31fbc565c90_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

浏览器输出内容,成功实现了视图映射,也就是原先在Spring MVC 配置文件中实现的功能。

为什么会实现这个功能呢?

首先WebMvcAutoConfiguration是Spring Boot中关于Spring MVC自动配置类,WebMvcAutoConfiguration自动配置类中包含了一个静态类WebMvcAutoConfigurationAdapter

5123b9461f814ed390d5427e45e1a1e4_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

WebMvcAutoConfigurationAdapter也是实现了WebMvcConfigurer,并且在该类中配置类上面提到的视图解析器以及静态资源访问控制等

image.png

WebMvcAutoConfigurationAdapter使用@Import注解导入了EnableWebMvcConfiguration类,EnableWebMvcConfiguration继承了DelegatingWebMvcConfiguration,DelegatingWebMvcConfiguration类中包含了一个setConfigurers方法

image.png

@Autowire标注在setConfigurers方法上,方法的参数就要从容器中获取,也就是说从容器中获取所有的WebMvcConfigure赋值到configurers中,DelegatingWebMvcConfiguration类中下面所有的配置,比如添加格式转换器

image.png

添加转换器就是将容器中所有的Formatter添加到添加都配置中去

image.png

所以自定义的HttpMessageConverter和ViewResolver也会起作用,因为也会被遍历到,添加到配置中和Spring Boot本身已经做好的配置一起发挥作用

这就是为什么通过添加@Configuration注解并实现WebMvcConfigure类可以让自定义的配置和Spring Boot中Spring MVC的自动配置同时发挥作用

完全替代Web MVC的自动配置

官网中同时也提到如果你想完全控制Spring MVC,可以在自定义的配置类上添加@EnableWebMVC注解

If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc, or alternatively add your own @Configuration-annotated DelegatingWebMvcConfiguration as described in the Javadoc of @EnableWebMvc.

在LilithMvcConfig配置类上添加@EnableWebMvc,重新启动应用,在浏览器上访问index1.html页面

image.png

将@EnableWebMvc注解注释,再次启动应用,在浏览器上访问index1.html页面

image.png

index1.html页面可以正常访问。而上面添加了@EnableWebMvc注解则无法访问index1.html页面。

@EnableWebMvc使得Spring MVC自动配置失效,静态资源映射规则全部失效,所有的静态资源都无法访问。

为什么@EnableWebMv会导致所有自动配置全部失效

@EnableWebMvc导入了一个DelegatringWebMvcConfiguration类

image.png

DelegatringWebMvcConfiguration又继承了WebMvcConfigurationSupport

image.png

再回来看WebMvcAutoConfiguration自动配置类上标注了条件注解 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)也就是说,只有在WebMvcConfigurationSupport不在容器中时才会将自动配置类导入容器中。@EnableWebMvc注解往容器中导入了一个WebMvcConfigurationSupport的子类DelegatringWebMvcConfiguration,这就会导致WebMvcAutoConfiguration不会导入到容器中,当然也就无法发挥自动配置的作用了

image.png

而@EnableWebMvc注解导入的WebMvcConfigurationSupport的子类DelegatringWebMvcConfiguration只包含了Spring MVC最基本的功能 ;而视图解析器,viewController,拦截器都需要自己配置。


相关文章
|
12天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
24 2
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
56 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
监控 Java 应用服务中间件
Spring和Spring Boot的区别
Spring和Spring Boot的主要区别,包括项目配置、开发模式、项目依赖、内嵌服务器和监控管理等方面,强调Spring Boot基于Spring框架,通过约定优于配置、自动配置和快速启动器等特性,简化了Spring应用的开发和部署过程。
54 19
|
1月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
68 2
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
109 1
|
1月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
28 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
1月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
27 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
1月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
182 2
|
1月前
|
前端开发 安全 Java
【Spring】Spring Boot项目创建和目录介绍
【Spring】Spring Boot项目创建和目录介绍
84 2
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
下一篇
无影云桌面