SpringBoot-1-2-MVC 的配置工作环境
引言上篇文章我们建立了springboot的基本认知通过“自动配置”和“起步依赖”来简化Spring应用的搭建。本篇我们一起来理解Web开发中最核心的模块Spring MVC深入理解为什么我们几乎不需要任何配置就能够在SpringBoot中运行一个完整的Web应用。1.依赖在传统的Spring MVC项目中我们需显式引入spring-webmvc\servlet-api 等多个坐标且需谨慎处理各版本间的兼容性稍有不慎便会引发依赖冲突。而在Spring Boot中只需引入一个起步依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-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还是发送JSONJackson都会进行相关的序列化和反序列化。注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:8080127.0.0.1:8080访问。如果需要修改端口需要添加或修改配置文件可能叫application.properties或是application.yml在propertiesserver.port8081在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。综上如果我们的配置类加上EnableWebMvcSpring容器中就会存在一个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与全局异常处理。