Spring Boot 的自动配置为 Spring MVC 做了哪些事情?

Spring Boot 的自动配置为 Spring MVC 做了大量的工作,极大的简化了我们开发时的配置负担,我们可以快速启动并运行一个基于 Spring MVC 的 Web 应用。以下是 Spring Boot 自动配置为 Spring MVC 所做的主要事情:

  1. DispatcherServlet 的自动注册和配置:

    • 注册 DispatcherServlet Spring Boot 会自动检测到 spring-webmvc 在类路径上,并自动注册一个名为 dispatcherServletDispatcherServlet Bean。它会被映射到应用的根路径 (/),处理所有进入应用的HTTP请求。
    • Servlet 容器集成: Spring Boot 内嵌了常见的 Servlet 容器(如 Tomcat、Jetty、Undertow),并自动配置 DispatcherServlet 与这些容器集成,无需手动配置 web.xml (在传统的Servlet应用中是必需的)。
  2. WebMvcConfigurationSupport / WebMvcAutoConfiguration:

    • WebMvcAutoConfiguration 是 Spring Boot 自动配置 MVC 的核心。它会根据类路径上的依赖和开发者自定义的配置,自动配置许多 Spring MVC 的核心组件。
    • 它通常会导入 EnableWebMvcConfiguration (Spring Boot 版本) 或类似的配置类,这些类继承自 WebMvcConfigurationSupport,并提供了一系列合理的默认配置。
  3. 视图解析器 (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 的视图解析器会被自动配置。
  4. 静态资源处理 (Static Resource Handling):

    • 如之前讨论的,Spring Boot 会自动配置静态资源处理器,从 classpath:/static/, classpath:/public/, classpath:/resources/, classpath:/META-INF/resources/ 等位置提供静态内容(如 HTML, CSS, JavaScript, 图片)。
    • 还包括对 WebJars 的自动支持。
  5. 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 等也会被配置。
  6. ContentNegotiationManager 的自动配置:

    • 自动配置一个 ContentNegotiationManager,用于根据请求(如 Accept 头)来决定响应的内容类型(例如,返回JSON还是XML)。默认情况下,它会优先考虑路径扩展名、URL参数(如果开启)和 Accept 头。
  7. Formatter 和 Converter 的自动注册:

    • 如果定义了实现了 FormatterConverter 接口的 Bean,Spring Boot 会自动将它们注册到 FormattingConversionService 中,使得它们可以在数据绑定和类型转换时被使用。
  8. 错误处理 (Error Handling):

    • Spring Boot 提供了一个默认的 /error 映射,用于处理未捕获的异常和HTTP错误状态码。
    • 它会生成一个 "Whitelabel Error Page" (一个简单的HTML错误页面) 或JSON错误响应(如果客户端请求的是JSON)。
    • 开发者可以自定义错误页面或错误处理器。
  9. LocaleResolver 的自动配置:

    • 用于国际化 (i18n)。Spring Boot 会自动配置一个 AcceptHeaderLocaleResolver,它会根据HTTP请求的 Accept-Language 头来确定用户的区域设置。
  10. ThemeResolver 的自动配置:

    • 如果使用Spring MVC的主题功能,Spring Boot 会自动配置一个 FixedThemeResolver
  11. MultipartResolver 的自动配置:

    • 如果 spring-web 在类路径上,并且存在Servlet API 3.0+ 的实现,Spring Boot 会自动配置一个 StandardServletMultipartResolver (或 CommonsMultipartResolver 如果Apache Commons FileUpload存在且配置了),用于处理文件上传 (multipart/form-data 请求)。相关的 spring.servlet.multipart.* 属性可以用来配置上传限制等。
  12. HiddenHttpMethodFilter 的自动配置:

    • 允许在HTML表单中使用HTTP方法如PUT、DELETE等,通过一个隐藏的 _method 字段。
    • 可以通过 spring.mvc.hiddenmethod.filter.enabled=false 禁用。
  13. FormContentFilter 的自动配置:

    • 使得HTTP PUT、PATCH、DELETE 请求的表单数据能够像POST请求一样被绑定到 @RequestBody 参数或通过 HttpServletRequest#getParameter 获取。
    • 可以通过 spring.mvc.formcontent.filter.enabled=false 禁用。
  14. Web 数据绑定初始化器 (WebBindingInitializer):

    • 自动配置一个 ConfigurableWebBindingInitializer,用于初始化 WebDataBinder 实例,这在处理表单提交和请求参数绑定时非常重要。

我们如何自定义自动配置?

虽然 Spring Boot 做了很多自动配置,但它也提供了多种方式让我们在开发的时候覆盖或自定义这些配置:

  • application.propertiesapplication.yml 许多自动配置的行为可以通过这些配置文件中的属性来调整。例如,server.portspring.mvc.static-path-patternspring.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配置,让我们可以专注于业务逻辑的实现 。

相关推荐
{{uname}}2 小时前
利用WebSocket实现实时通知
网络·spring boot·websocket·网络协议
goTsHgo3 小时前
Spring Boot 自动装配原理详解
java·spring boot
唐僧洗头爱飘柔95275 小时前
【SSM-SSM整合】将Spring、SpringMVC、Mybatis三者进行整合;本文阐述了几个核心原理知识点,附带对应的源码以及描述解析
java·spring·mybatis·springmvc·动态代理·ioc容器·视图控制器
秋野酱7 小时前
基于javaweb的SpringBoot爱游旅行平台设计和实现(源码+文档+部署讲解)
java·spring boot·后端
有梦想的攻城狮7 小时前
spring中的@Async注解详解
java·后端·spring·异步·async注解
qq_12498707537 小时前
原生小程序+springboot+vue医院医患纠纷管理系统的设计与开发(程序+论文+讲解+安装+售后)
java·数据库·spring boot·后端·小程序·毕业设计
伊成8 小时前
一文详解Spring Boot如何配置日志
java·spring boot·单元测试
.生产的驴11 小时前
Docker 部署Nexus仓库 搭建Maven私服仓库 公司内部仓库
java·运维·数据库·spring·docker·容器·maven
嘵奇11 小时前
Spring Boot中HTTP连接池的配置与优化实践
spring boot·后端·http