Spring Boot 的自动配置为 Spring MVC 做了大量的工作,极大的简化了我们开发时的配置负担,我们可以快速启动并运行一个基于 Spring MVC 的 Web 应用。以下是 Spring Boot 自动配置为 Spring MVC 所做的主要事情:
-
DispatcherServlet 的自动注册和配置:
- 注册
DispatcherServlet
: Spring Boot 会自动检测到spring-webmvc
在类路径上,并自动注册一个名为dispatcherServlet
的DispatcherServlet
Bean。它会被映射到应用的根路径 (/
),处理所有进入应用的HTTP请求。 - Servlet 容器集成: Spring Boot 内嵌了常见的 Servlet 容器(如 Tomcat、Jetty、Undertow),并自动配置
DispatcherServlet
与这些容器集成,无需手动配置web.xml
(在传统的Servlet应用中是必需的)。
- 注册
-
WebMvcConfigurationSupport / WebMvcAutoConfiguration:
WebMvcAutoConfiguration
是 Spring Boot 自动配置 MVC 的核心。它会根据类路径上的依赖和开发者自定义的配置,自动配置许多 Spring MVC 的核心组件。- 它通常会导入
EnableWebMvcConfiguration
(Spring Boot 版本) 或类似的配置类,这些类继承自WebMvcConfigurationSupport
,并提供了一系列合理的默认配置。
-
视图解析器 (View Resolvers) 的自动配置:
InternalResourceViewResolver
: 如果没有其他视图解析器被配置,且类路径上存在javax.servlet.Servlet
(即在Servlet环境中),Spring Boot 会自动配置一个InternalResourceViewResolver
,用于解析 JSP 视图。它会默认查找/WEB-INF/
目录下的.jsp
文件(前缀和后缀可以配置)。- 模板引擎视图解析器: 如果类路径上存在其他模板引擎的依赖(如 Thymeleaf, FreeMarker, Groovy Templates, Mustache),Spring Boot 会自动配置相应的视图解析器,并设置合理的前缀和后缀。例如,如果添加了
spring-boot-starter-thymeleaf
,Thymeleaf 的视图解析器会被自动配置。
-
静态资源处理 (Static Resource Handling):
- 如之前讨论的,Spring Boot 会自动配置静态资源处理器,从
classpath:/static/
,classpath:/public/
,classpath:/resources/
,classpath:/META-INF/resources/
等位置提供静态内容(如 HTML, CSS, JavaScript, 图片)。 - 还包括对 WebJars 的自动支持。
- 如之前讨论的,Spring Boot 会自动配置静态资源处理器,从
-
HTTP 消息转换器 (HttpMessageConverters) 的自动配置:
- Spring Boot 会根据类路径上的依赖自动注册一系列
HttpMessageConverter
。这些转换器用于将 Controller 方法的返回值转换为 HTTP 响应体(例如,将Java对象转为JSON或XML),以及将HTTP请求体转换为Java对象。 - Jackson (JSON): 如果
jackson-databind
在类路径上,MappingJackson2HttpMessageConverter
会被自动配置,用于处理JSON数据。这是最常见的配置。 - JAXB / Jackson XML (XML): 如果类路径上有相应的XML处理库 (如
jakarta.xml.bind-api
和实现,或jackson-dataformat-xml
),相应的XML转换器也会被自动配置。 - 其他转换器如
StringHttpMessageConverter
,ByteArrayHttpMessageConverter
等也会被配置。
- Spring Boot 会根据类路径上的依赖自动注册一系列
-
ContentNegotiationManager
的自动配置:- 自动配置一个
ContentNegotiationManager
,用于根据请求(如Accept
头)来决定响应的内容类型(例如,返回JSON还是XML)。默认情况下,它会优先考虑路径扩展名、URL参数(如果开启)和Accept
头。
- 自动配置一个
-
Formatter 和 Converter 的自动注册:
- 如果定义了实现了
Formatter
或Converter
接口的 Bean,Spring Boot 会自动将它们注册到FormattingConversionService
中,使得它们可以在数据绑定和类型转换时被使用。
- 如果定义了实现了
-
错误处理 (Error Handling):
- Spring Boot 提供了一个默认的
/error
映射,用于处理未捕获的异常和HTTP错误状态码。 - 它会生成一个 "Whitelabel Error Page" (一个简单的HTML错误页面) 或JSON错误响应(如果客户端请求的是JSON)。
- 开发者可以自定义错误页面或错误处理器。
- Spring Boot 提供了一个默认的
-
LocaleResolver
的自动配置:- 用于国际化 (i18n)。Spring Boot 会自动配置一个
AcceptHeaderLocaleResolver
,它会根据HTTP请求的Accept-Language
头来确定用户的区域设置。
- 用于国际化 (i18n)。Spring Boot 会自动配置一个
-
ThemeResolver
的自动配置:- 如果使用Spring MVC的主题功能,Spring Boot 会自动配置一个
FixedThemeResolver
。
- 如果使用Spring MVC的主题功能,Spring Boot 会自动配置一个
-
MultipartResolver
的自动配置:- 如果
spring-web
在类路径上,并且存在Servlet API 3.0+ 的实现,Spring Boot 会自动配置一个StandardServletMultipartResolver
(或CommonsMultipartResolver
如果Apache Commons FileUpload存在且配置了),用于处理文件上传 (multipart/form-data
请求)。相关的spring.servlet.multipart.*
属性可以用来配置上传限制等。
- 如果
-
HiddenHttpMethodFilter
的自动配置:- 允许在HTML表单中使用HTTP方法如PUT、DELETE等,通过一个隐藏的
_method
字段。 - 可以通过
spring.mvc.hiddenmethod.filter.enabled=false
禁用。
- 允许在HTML表单中使用HTTP方法如PUT、DELETE等,通过一个隐藏的
-
FormContentFilter
的自动配置:- 使得HTTP PUT、PATCH、DELETE 请求的表单数据能够像POST请求一样被绑定到
@RequestBody
参数或通过HttpServletRequest#getParameter
获取。 - 可以通过
spring.mvc.formcontent.filter.enabled=false
禁用。
- 使得HTTP PUT、PATCH、DELETE 请求的表单数据能够像POST请求一样被绑定到
-
Web 数据绑定初始化器 (
WebBindingInitializer
):- 自动配置一个
ConfigurableWebBindingInitializer
,用于初始化WebDataBinder
实例,这在处理表单提交和请求参数绑定时非常重要。
- 自动配置一个
我们如何自定义自动配置?
虽然 Spring Boot 做了很多自动配置,但它也提供了多种方式让我们在开发的时候覆盖或自定义这些配置:
application.properties
或application.yml
: 许多自动配置的行为可以通过这些配置文件中的属性来调整。例如,server.port
,spring.mvc.static-path-pattern
,spring.jackson.*
等。- 自定义 Bean: 如果我们自己定义了一个与自动配置相同类型的 Bean (例如,自定义一个
ViewResolver
Bean),Spring Boot 的自动配置通常会"退让" (back off),使用我们定义的 Bean。 - 实现
WebMvcConfigurer
: 这是一个非常常用的方式。通过创建一个实现WebMvcConfigurer
接口的@Configuration
类,我们可以添加自定义的拦截器、格式化器、参数解析器、视图控制器、配置静态资源处理等,而不会完全禁用Spring Boot的MVC自动配置。 - 使用
@EnableWebMvc
(谨慎使用): 如果在配置类上添加@EnableWebMvc
注解,Spring Boot 的MVC自动配置将会完全失效,开发者需要完全接管Spring MVC的配置。这通常只在需要非常细粒度控制且不希望受自动配置影响时使用。
总而言之,Spring Boot 的自动配置大大减少了搭建 Spring MVC 应用所需的样板代码和XML配置,让我们可以专注于业务逻辑的实现 。