引言:
上篇文章我们建立了springboot的基本认知:通过“自动配置”和“起步依赖”来简化Spring应用的搭建。本篇我们一起来理解Web开发中最核心的模块(Spring MVC),深入理解为什么我们几乎不需要任何配置,就能够在SpringBoot中运行一个完整的Web应用。
1.依赖
在传统的Spring MVC项目中,我们需显式引入spring-webmvc\servlet-api 等多个坐标,且需谨慎处理各版本间的兼容性,稍有不慎便会引发依赖冲突。
而在Spring Boot中,只需引入一个起步依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>引入之后,就直接具备完整的Web开发能力。`spring-boot-starter-web`本身不是一个具体的库,他是一个依赖集合(代表或者说替换上面的多种依赖),其内部声明了一组经过相关测试和版本相互兼容的依赖,具有Web开发的全部基础组件。
其中包括:SpringMVC框架、嵌入式tomcat、Jackson、其他相关(参数检验、静态资源处理等)
a.spring-boot-starter-web大致模块
spring-boot-starter-web ├── Spring MVC │ ├── spring-web │ └── spring-webmvc ├── Embedded Tomcat │ └── spring-boot-starter-tomcat ├── Jackson │ ├── jackson-databind │ ├── jackson-core │ └── jackson-annotations └── 其他 Web 相关依赖 ├── spring-boot-starter(核心启动器) ├── spring-boot-starter-json(包含 Jackson) ├── spring-boot-starter-validation(可选,但常用) └── 其他其中:
`spring-web`:提供基础的Web功能。
`spring-webmvc`:实现完整的SpringMvc框架,包括Controller、DispatcherServlet、视图解析等。
`spring-boot-starter-tomcat`:引入Tomcat的内嵌版本,使得Web应用可以作为一个独立的java进程运行。
`Jackson`:当前流行的JSON处理库,SpringBoot默认使用它来处理HTTP请求和相应中的JSON数据。无论是接收JSON还是发送JSON,Jackson都会进行相关的序列化和反序列化。
注:spring-boot-starter-web是一个精心设计的组合依赖,我们只需引入它即可获得一套完整的、版本兼容的 Web 开发环境,无需再为底层依赖的版本选择耗费精力。
2.SpringBoot整合SpringMVC
学习SpringBoot记住核心思想:`默认`,你不写我就默认。很多东西没有手动配置,SpringBoot会根据当前项目依赖和环境,完成默认配置。
先说答案,答案就是自动配置
SpringBoot启动的时候,会扫描类路径下的各种条件,发现依赖,就自动应用相应的配置。
其中SpringMVC核心的自动配置类:`webMvcAutoConfiguration`,该类会根据当前项目环境,自动配置一下相关内容:
注册一个前端控制器(DispatcherServlet)
配置`RequestMappingHandlerMapping`和`RequestMappingHandlerAdapter`
配置消息转换器(包括JSON转换器(Jackson))
配置静态资源处理、异常机制处理、视图解析
等等。
注:我们目前只需要记住SpringBoot通过自动配置,为SpringMVC提供了开箱即用的默认行为。
a.SpringMVC默认配置
当我们使用SpringBoot整合SpringMVC的时候,SpringBoot会根据当前项目环境,为SpeingMVC提供默认环境。也就是上面:你不写我就默认配置,按照默认规则帮你配置。
它提供了哪些默认配置呢,除了上面提到的
注册一个前端控制器(DispatcherServlet)·······等,还使用了如下配置。
(1).默认使用嵌入式tomcat
这就意味我们并不需要单独下载安装一个tomcat服务器,然后打包放到外部服务器上了。同时Tomcat服务器作为一个普通的java库打包进我的应用JAR文件中,当运行JAR包的时候,SpringBoot会启动内嵌的Tomcat服务器,然后将SpringMVC部署到这个容器中。
相关好处:无需外部部署容器、环境一致性(每个应用自带相同版本的Tomcat)、微服务友好(每个微服务独立运行)
(2).默认端口
SpringBoot默认的Web服务器端口是8080,启动后直接可以通过http://localhost:8080(127.0.0.1:8080)访问。
如果需要修改端口需要添加或修改配置文件可能叫application.properties或是application.yml
在properties:
server.port=8081在yml中:
server: port: 8081然后重启应用,更换端口后就可以访问了。
除了上面介绍的配置之外,SpringBoot 还提供了大量其他配置项。
除了使用配置文件进行配置之外,SpringBoot 也支持通过Java 配置类对项目进行配置。
例如最常见的配置,配置DispatcherServlet的映射路径。默认是`/`,如果设置`/Long`,则表示所有请求都需要以`/Long`开头才能被MVC处理。
注:`servlet*`->配置Tomcat/Web Servlet本身
`spring.mvc*`->配置SpringMVC框架
分类可以帮我们快速定位哪里出现错误。
3.MVC配置的相关入口
在SpringBoot中负责MVC自动配置的类是WebMvcAutoConfiguration。
一般步骤是:
Spring Boot ↓ WebMvcAutoConfiguration ↓ Spring MVC 自动配置默认情况下SpringBoot会加载WebMvcAutoConfiguration,需要满足以下条件:
- 类路径下存在DispatcherServlet和Servlet类(引入依赖spring-webmvc)。
- 应用是Web应用。
- 没有自定义WebMvcConfigurationSupport类型的Bean(解释如下图)。
满足以上条件,SpringBoot就会使用默认配置。
WebMvcConfigurationSupport ↑ │ 继承 │ DelegatingWebMvcConfiguration (由 @EnableWebMvc 导入)父类(WebMvcConfigurationSupport)是SpringMVC的基础配置类。
子类(DelegatingWebMvcConfiguration)专门收集并调用所有WebMvcConfigurer实现。
原因:在WebMvcAutoConfiguration大多数方法都标注了条件注解,如`@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)`
表示如果容器中存在WebMvcConfigurationSupport的Bean,则对应的自动配置逻辑将不会执行。
而如果在自定义的配置类上加入注解`@EnableWebMvc`,其中`@EnableWebMvc`定义如下:
@Import(DelegatingWebMvcConfiguration.class) public @interface EnableWebMvc {}他导入了`DelegatingWebMvcConfiguration`而且`DelegatingWebMvcConfiguration`继承`WebMvcConfigurationSupport`。综上,如果我们的配置类加上`@EnableWebMvc`Spring容器中就会存在一个`WebMvcConfigurationSupport`的Bean,所以SpringBoot中对应的自动配置逻辑就不会执行。
最终执行结果:SpringBoot的默认MVC自动配置全部退让,你的配置类完全控制配置,没有配置的部分不会自动补齐。
如何完全接管自动配置类:
- 继承WebMvcConfigurationSupport重写方法。
- 实现WebMvcConfigurer接口(定制接口,实现个性化配置)+@EnableWebMvc。
合并配置
不使用@EnableWebMvc注解,而是实现WebMvcConfigurer,只需要自定义类实现该类后就可以自定义配置了,只需要重写对应的方法(配置),对于没有重写的配置则使用默认配置。
总结:
通过本文分析可知,spring-boot-starter-web起步依赖结合WebMvcAutoConfiguration自动配置类,是 Spring Boot 简化 Web 开发的基石。我们不仅了解了它默认集成了 Tomcat、Jackson 和 Spring MVC 核心组件,更深入剖析了@EnableWebMvc与 WebMvcConfigurer在自定义配置时的本质区别。
掌握了这些底层逻辑,你就能在遇到配置失效时快速定位问题。接下来,我们将基于这套已配置好的 MVC 环境,探讨日常开发中绕不开的请求参数校验(Validation)与全局异常处理。