SpringBoot3学习笔记-WebMvcAutoConfiguration类

SpringBoot3学习笔记-WebMvcAutoConfiguration类
最新回答
雪蝶宿秋风

2024-02-14 17:06:21

WebMvcAutoConfiguration 类是 SpringBoot3 自动配置机制的核心组件之一,负责 Spring MVC 的自动化配置。 它通过条件注解检测应用上下文,自动完成 DispatcherServlet、静态资源处理、消息转换器等关键配置,同时提供灵活的扩展点支持自定义配置。

一、生效条件

WebMvcAutoConfiguration 的自动配置基于以下条件注解实现,确保仅在满足特定环境时生效:

  • @AutoConfiguration(after = {...})配置顺序在 DispatcherServletAutoConfiguration、TaskExecutionAutoConfiguration 和 ValidationAutoConfiguration 之后,确保依赖组件已初始化。
  • @ConditionalOnWebApplication(type = Type.SERVLET)仅对基于 Servlet 的 Web 应用生效(排除响应式 Web 应用)。
  • @ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})类路径中需存在 Servlet、DispatcherServlet 和 WebMvcConfigurer 类,确保 Spring MVC 环境可用。
  • @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)若容器中不存在 WebMvcConfigurationSupport 的 Bean,则自动配置生效(避免与显式配置冲突)。
  • @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)设置较高的优先级,确保配置在多数场景下优先生效。

图:WebMvcAutoConfiguration 类通过条件注解控制自动配置的生效逻辑二、核心作用

WebMvcAutoConfiguration 主要完成以下配置任务:

  • DispatcherServlet 配置自动注册 Spring MVC 的核心控制器 DispatcherServlet,并映射到根路径 /。
  • 静态资源处理配置静态资源(如 JS、CSS、图片)的访问路径(默认从 /static、/public 等目录加载),并支持缓存策略。
  • Web MVC 基础设置包括 URL 路径匹配规则、内容协商策略、视图解析器(如 InternalResourceViewResolver)等。
  • 消息转换器(Message Converters)根据类路径中的依赖(如 Jackson 或 JAXB),自动配置 JSON/XML 消息的序列化与反序列化。
  • 数据验证若存在 Hibernate Validator 等验证器,自动配置数据校验功能。
  • 国际化支持配置消息源(MessageSource),支持多语言(i18n)场景。
  • 文件上传若类路径中存在 MultipartResolver 相关类,自动启用文件上传功能。
  • 异常处理提供默认的错误页面(如 /error 路径),处理未捕获的异常。
三、修改配置的三种方式

SpringBoot3 支持通过以下方式覆盖或扩展 WebMvcAutoConfiguration 的默认行为:

1. 实现 WebMvcConfigurer 接口

通过创建配置类实现 WebMvcConfigurer,可自定义拦截器、资源处理器、消息转换器等,不替换自动配置,而是增量扩展。示例:添加自定义拦截器

@Configurationpublic class MyMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyCustomInterceptor()); }}2. 使用 application.properties/yml 文件

通过配置文件调整 Spring MVC 的默认行为,无需编写代码。示例:修改静态资源路径和缓存时间

# 自定义静态资源目录spring.web.resources.static-locations=classpath:/a/,classpath:/b/# 设置缓存时间(秒)spring.web.resources.cache.period=36003. 使用 @EnableWebMvc 注解

若需完全接管 Spring MVC 配置,可在配置类上添加 @EnableWebMvc,但会禁用所有自动配置,需手动配置所有组件。示例:完全自定义配置

@Configuration@EnableWebMvcpublic class FullCustomConfig implements WebMvcConfigurer { // 需手动配置所有必要组件(如 DispatcherServlet、视图解析器等)}四、自定义配置实例1. 自定义 DispatcherServlet 映射路径

通过 ServletRegistrationBean 修改默认的 / 映射路径:

@Beanpublic ServletRegistrationBean<DispatcherServlet> dispatcherServlet() { return new ServletRegistrationBean<>(new DispatcherServlet(), "/myapp/*");}2. 动态添加静态资源目录

通过 WebMvcConfigurer 扩展静态资源规则:

@Configurationpublic class MyWebMvcConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/my-resources/") .addResourceLocations("classpath:/my-resources/") .setCachePeriod(3600); }}3. 自定义消息转换器

覆盖默认的 JSON 转换逻辑(如使用 Gson 替代 Jackson):

@Configurationpublic class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new GsonHttpMessageConverter()); // 添加自定义转换器 }}4. 全局异常处理

通过 @ControllerAdvice 捕获特定异常并返回自定义响应:

@ControllerAdvicepublic class MyGlobalExceptionHandler { @ExceptionHandler(MyCustomException.class) public ResponseEntity<Object> handleCustomException(MyCustomException ex) { return ResponseEntity.badRequest().body("Error: " + ex.getMessage()); }}五、总结

WebMvcAutoConfiguration 是 SpringBoot3 实现“约定优于配置”的核心类,通过条件注解和灵活的扩展点,平衡了默认配置的便利性与自定义需求的可能性。开发者可根据场景选择增量扩展(如 WebMvcConfigurer)、配置调整(如 application.yml)或完全自定义(如 @EnableWebMvc),实现高效的 Web 开发。