ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Spring Boot Web开发与内嵌容器详解

Spring Boot Web开发与内嵌容器详解 Spring Boot Web开发与内嵌容器详解定位第 05 篇讲透内嵌容器机制与定制、Web 相关自动配置、静态资源、错误处理与常见 Web 定制适用版本Spring Boot 3.xJDK 17目录一、内嵌容器二、Web 自动配置三、静态资源与模板四、错误处理五、常见定制六、总结七、常见高频面试题一、内嵌容器1.1 机制spring-boot-starter-web默认引入内嵌Tomcat。Boot 的ServletWebServerFactoryAutoConfiguration在容器刷新的onRefresh阶段FW-01 refresh 第⑨步创建并启动内嵌 Servlet 容器注册 DispatcherServlet。refresh → onRefresh → createWebServer()创建 Tomcat 实例、配置连接器 → 注册 DispatcherServlet、过滤器 → 启动监听1.2 切换容器默认Tomcat 换 Undertow排除 spring-boot-starter-tomcat引入 spring-boot-starter-undertow 换 Jetty同理换 jetty 响应式WebFlux默认 Netty1.3 定制容器的三种方式① 属性server.port / server.servlet.context-path / server.tomcat.threads.max ② WebServerFactoryCustomizerConfigurableServletWebServerFactory编程式 ③ 直接自定义 Servlet/Filter/Listener 注册ServletRegistrationBean 等二、Web 自动配置WebMvcAutoConfigurationWB 篇细讲机制默认提供装配说明DispatcherServlet前端控制器映射/消息转换器JacksonJSON、String、表单等静态资源处理映射 classpath 资源到/**欢迎页/错误页默认行为格式化日期、数字格式化支持定制而不覆盖想加拦截器/改格式化实现WebMvcConfigurer加配置而不是EnableWebMvc后者关闭 Boot 默认自动配置全部手写——除非确有必要不要用。三、静态资源与模板3.1 静态资源默认从这些位置服务静态文件映射到/**classpath:/static/、classpath:/public/、classpath:/resources/、classpath:/META-INF/resources/src/main/resources/static/app.js → http://host/app.js3.2 模板引擎引入对应 starter如 Thymeleaf模板放classpath:/templates/由自动配置装配视图解析GetMapping(/page) String page(Model m) { m.addAttribute(name, x); return index; } → 渲染 templates/index.html前后端分离项目通常不用模板引擎纯 REST 前端工程。四、错误处理4.1 默认机制未捕获异常/404 默认转发到/error返回状态码 默认错误体HTML 或 JSON。4.2 全局异常处理主流做法RestControllerAdvicepublicclassGlobalExceptionHandler{ExceptionHandler(BizException.class)publicResponseEntityErrorBodybiz(BizExceptione){returnResponseEntity.badRequest().body(newErrorBody(e.getCode(),e.getMessage()));}ExceptionHandler(Exception.class)publicResponseEntityErrorBodyfallback(Exceptione){returnResponseEntity.status(500).body(ErrorBody.internal());}}此处强调生产必须有全局兜底避免堆栈直接暴露。4.3 自定义错误页/控制器静态错误页放src/main/resources/error/404.html深度定制实现ErrorController。五、常见定制5.1 JSON 定制# 属性方式 spring.jackson.date-formatyyyy-MM-dd HH:mm:ss spring.jackson.property-naming-strategySNAKE_CASE # Bean 方式更灵活自定义 ObjectMapper 或 Jackson2ObjectMapperBuilderCustomizer5.2 文件上传大小spring.servlet.multipart.max-file-size10MB spring.servlet.multipart.max-request-size20MB5.3 优雅停机server.shutdowngraceful spring.lifecycle.timeout-per-shutdown-phase30s停机时停止接收新请求、等待在途请求完成超时强制关闭——发布零中断的关键呼应无损上下线。5.4 CORSConfigurationpublicclassCorsConfigimplementsWebMvcConfigurer{OverridepublicvoidaddCorsMappings(CorsRegistryr){r.addMapping(/api/**).allowedOrigins(https://web.example.com);}}六、总结内嵌容器starter-web 默认 Tomcat在 refresh 的 onRefresh 阶段创建启动可换 Undertow/Jetty定制走属性或 WebServerFactoryCustomizer。Web 自动配置DispatcherServlet、消息转换、静态资源、默认 MVC 行为用 WebMvcConfigurer 增量定制勿用 EnableWebMvc 覆盖默认。静态/模板静态资源默认映射若干 classpath 目录模板引擎走 starter templates/。错误处理默认 /error生产用 RestControllerAdvice 全局兜底避免堆栈外泄。高频定制Jackson、multipart 大小、优雅停机server.shutdowngraceful、CORS。七、常见高频面试题1. Spring Boot 如何启动内嵌 Tomcat要点starter-web 引入内嵌 Tomcat 依赖应用启动刷新上下文时ServletWebServerFactoryAutoConfiguration 在 onRefresh 阶段refresh 第⑨步通过 ServletWebServerFactory 创建 Tomcat 实例、配置连接器注册 DispatcherServlet 与过滤器然后启动监听端口。这改变了应用部署进外部容器的传统模型变为容器随应用走java -jar 直接运行。2. 怎么切换内嵌容器如换成 Undertow要点排除默认的 Tomcat 依赖再引入目标容器。Maven 中在 spring-boot-starter-web 里 exclude spring-boot-starter-tomcat然后引入 spring-boot-starter-undertow或 jetty。Boot 的自动配置按 classpath 上存在的容器选择对应工厂。响应式应用WebFlux默认用 Netty。切换主要为了性能特性或团队偏好功能上通常无差异。3. EnableWebMvc 和 WebMvcConfigurer 的区别Boot 里用哪个要点EnableWebMvc 会完全接管 MVC 配置关闭 Spring Boot 的 WebMvcAutoConfiguration 默认行为静态资源、默认转换器、格式化等都没了需要全部手写除非要完全控制否则不要用。WebMvcConfigurer 是增量定制接口——实现它的方法加拦截器、改 CORS、配格式化叠加在 Boot 默认配置之上保留默认便利。Boot 项目标准做法是实现 WebMvcConfigurer。4. Spring Boot 默认如何处理静态资源要点自动配置把 classpath 下的 /static/、/public/、/resources/、/META-INF/resources/ 目录映射到 /** 路径对外服务如 static/app.js 可通过 /app.js 访问。可通过属性自定义位置与映射spring.web.resources。对前后端分离项目静态资源常由前端服务器/CDN 托管Boot 只提供 API。5. Spring Boot 如何做全局异常处理要点主流是 RestControllerAdviceControllerAdvice ResponseBody定义全局异常处理器用 ExceptionHandler 按异常类型映射为统一错误响应状态码 错误体覆盖业务异常、参数校验异常、兜底 Exception。它替代默认的 /error 白页避免堆栈信息外泄统一错误格式供前端处理。也可配静态错误页或自定义 ErrorController。6. 如何定制 Jackson 的 JSON 序列化如日期格式要点简单场景用属性spring.jackson.date-format、property-naming-strategy 等。复杂场景定义 Bean自定义 ObjectMapper 覆盖默认或更推荐实现 Jackson2ObjectMapperBuilderCustomizer在默认基础上增量定制保留 Boot 默认模块。注意直接 new ObjectMapper 作 Bean 会丢失 Boot 的默认配置应谨慎。7. 什么是优雅停机怎么开启要点优雅停机在关闭时先停止接收新请求等待在途请求处理完有超时上限再关闭避免发布期间用户请求被硬断。开启server.shutdowngraceful配合 spring.lifecycle.timeout-per-shutdown-phase 设等待上限。配合负载均衡摘流与容器编排的停机钩子实现发布零中断。8. 文件上传大小限制怎么配要点默认上限较小单文件与总请求各有限制需显式调大spring.servlet.multipart.max-file-size单文件、spring.servlet.multipart.max-request-size整请求。同时注意反向代理Nginx client_max_body_size与内嵌容器层的限制任一层卡住都会失败。大文件建议对象存储直传而非经应用转发。9. WebMvcAutoConfiguration 都自动装配了什么要点主要包括——DispatcherServlet映射 /、HttpMessageConverterJackson JSON、String、表单等、静态资源处理与欢迎页、默认错误处理基础、日期/数字格式化支持、表单编码等。这些构成零配置即可用的 Web 层。理解它有助于解释为什么引入 starter-web 就能直接写 RestController 返回 JSON。10. 为什么生产要配置全局异常兜底要点没有兜底时未捕获异常走默认 /error可能暴露堆栈与内部信息安全风险且错误格式不统一让前端无法可靠处理。全局 RestControllerAdvice 统一捕获并转换为约定的错误响应状态码 错误码 消息区分业务异常与系统异常系统异常记日志告警但不回传细节。这是接口规范与安全的基本要求。
返回列表