当前位置: 首页 > news >正文

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配置,让我们可以专注于业务逻辑的实现 。

相关文章:

  • 竞业禁止协议中AI技能限制的深度剖析
  • Java jar包程序 启动停止脚本 shell bash
  • STM32 __main汇编分析
  • 工具学习_VirusTotal使用
  • 前端学习(2)—— CSS详解与使用
  • 如何在 CentOS 7 虚拟机上配置静态 IP 地址并保持重启后 SSH 连接
  • OpenHarmony平台驱动开发(十五),SDIO
  • Android中LinearLayout线性布局使用详解
  • 块设备代码分析
  • SpringBoot中使用集群版Redis
  • 【一次成功!】Ubuntu22.04安装cartographer
  • 力扣HOT100之二叉树:543. 二叉树的直径
  • 湖南大学3D场景问答最新综述!3D-SQA:3D场景问答助力具身智能场景理解
  • PAC文件:智能代理配置的瑞士军刀
  • 机器学习 --- 数据集
  • 【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一)
  • 解锁课程编辑器之独特风姿
  • Java线程池性能优化全解析:从配置到实践
  • 合肥SMT贴片加工核心优势与工艺升级
  • 2025java面试题整理
  • 国家林草局原党组成员、副局长李春良接受审查调查
  • 西北大学副校长范代娣成陕西首富?系家庭财富,本人已从上市公司退出
  • 国产水陆两栖大飞机AG600批产首架机完成总装下线
  • 男子退机票被收90%的手续费,律师:虽然合规,但显失公平
  • 老人将房产遗赠给外孙,三个女儿却认为遗嘱应无效,法院判了
  • 80后莆田市文旅局长马骏登台与杨宗纬合唱,“演唱会秒变旅游推介会”