是什么
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
SpringBoot3 的 Web 开发能力,由 SpringMVC 提供,而 WebMvcAutoConfiguration
类是 SpringBoot 自动配置机制的一部分,专门用于配置 Spring MVC 的。这个类在 SpringBoot 应用程序中起着非常重要的作用,下面来看看它的详细作用。
什么用
生效条件
@AutoConfiguration(after = { DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class }) // 在这些自动配置之后
@ConditionalOnWebApplication(type = Type.SERVLET) // 如果是web应用就生效
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }) // 导入了这些类才生效
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class) // 容器中没有这个Bean
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@ImportRuntimeHints(WebResourcesRuntimeHints.class)
public class WebMvcAutoConfiguration {
//
}
上图 WebMvcAutoConfiguration
类在 SpringBoot 中通过条件注解来检测并应用自动配置。
作用
它主要负责以下配置:
-
DispatcherServlet配置:它自动配置了 Spring MVC 的核心控制器,即
DispatcherServlet
。这包括将其注册到 Servlet 容器中以及相关的路径映射。 -
静态资源处理:它自动配置了静态资源的处理,比如 JavaScript、CSS 和图片等。这涉及到配置资源的位置以及缓存策略。
-
Web MVC 配置:它自动配置了 Spring MVC 的基本设置,比如 URL 路径匹配、内容协商和视图解析器等。
-
Message converters:根据classpath中的类,自动配置消息转换器,这对于RESTful应用程序处理JSON或XML数据尤其重要。
-
数据验证:如果 classpath 中存在验证器(例如Hibernate Validator),则自动配置数据验证。
-
国际化:自动配置消息源,以支持 i18n。
-
文件上传:如果相关类(如
MultipartResolver
)在classpath中可用,它也会自动配置文件上传的支持。 -
异常处理:它自动配置了基础的异常处理,提供了一个默认的错误页面。
修改配置的三种方式
在 Spring Boot 2.x 及之后的版本中,包括 Spring Boot 3,自动配置主要通过各种 @Configuration
类来完成,其中 WebMvcAutoConfiguration
是处理 Spring MVC 自动配置的关键类。这个类利用 Spring Framework 的条件注解(如 @ConditionalOnWebApplication
、@ConditionalOnClass
、@ConditionalOnMissingBean
等),根据应用程序的上下文和类路径的状态来自动配置 Spring MVC。
在 Spring Boot 3 中,如果你想自定义 Spring MVC 的行为,通常会采取以下几种方法:
-
实现 WebMvcConfigurer 接口:通过创建一个配置类实现
WebMvcConfigurer
接口,并重写其中的方法,你可以自定义 Spring MVC 的配置,如拦截器、资源处理器、消息转换器等。这种方式不会替换掉 Spring Boot 的自动配置,而是在此基础上进行扩展。@Configuration public class MyMvcConfig implements WebMvcConfigurer { // 实现方法以自定义配置 }
-
使用 properties 或 yaml 文件:通过在
application.properties
或application.yml
文件中设置相关的 Spring MVC 属性,你可以调整 Spring Boot 的自动配置行为。 -
使用 @EnableWebMvc:如果你添加
@EnableWebMvc
注解到你的配置类上,这将完全接管 Spring MVC 的配置,禁用 Spring Boot 的 MVC 自动配置。这种方式适用于需要完全控制 Spring MVC 配置的场景,但请注意,这样做意味着你需要手动配置 Spring MVC 需要的所有组件。
自定义配置举例
SpringBoot3 的自动配置尝试提供合理的默认配置,同时留下足够的灵活性,允许开发人员根据需要覆盖或扩展特定的配置。注意,如果你提供了自己的配置(比如自定义的DispatcherServlet
、特定的WebMvcConfigurer
实现等),Spring Boot的自动配置将适当地后退,允许使用你的自定义设置。
这只是 WebMvcAutoConfiguration
类的一个高层次概述。具体配置和细节可能会根据你的具体需求和 SpringBoot 的版本有所不同。下面继续深入了解WebMvcAutoConfiguration
类在 SpringBoot3 中的作用,我们可以探讨一些具体的自动配置实例和细节。
1. 自定义 DispatcherServlet 配置
在Spring Boot中,DispatcherServlet
是自动配置的,但如果你想要自定义配置,比如修改默认的servlet映射(默认是"/"),你可以通过定义自己的ServletRegistrationBean
来实现。例如:
@Bean
public ServletRegistrationBean<DispatcherServlet> dispatcherServlet() {
ServletRegistrationBean<DispatcherServlet> reg = new ServletRegistrationBean<>(new DispatcherServlet(), "/myapp/*");
reg.setName("myDispatcherServlet");
return reg;
}
2. 静态资源配置
SpringBoot 自动为静态资源服务提供了配置,默认情况下,它们可以从 /static
、/public
、/resources
和/META-INF/resources
目录下被访问,见 org.springframework.boot.autoconfigure.web.WebProperties.Resources
public static class Resources {
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
"classpath:/resources/", "classpath:/static/", "classpath:/public/" };
}
但是,如果你需要修改这些默认设置或添加自定义缓存控制,你可以通过实现 WebMvcConfigurer
接口并重写相应的方法来实现,例如:
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/my-resources/**")
.addResourceLocations("classpath:/my-resources/")
.setCachePeriod(3600);
}
}
当然也可以通过配置文件修改:
# 自定义多个静态资源文件夹位置
spring.web.resources.static-locations=classpath:/a/,classpath:/b/,classpath:/static/
#设置缓存
spring.web.resources.cache.period=3600
3. 自定义MVC配置
SpringBoot 允许通过实现 WebMvcConfigurer
接口来自定义各种MVC设置。这包括拦截器、跨域请求处理、路径匹配配置等。例如,添加一个简单的拦截器可以如下实现:
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyCustomInterceptor());
}
}
4. 消息转换器
如果你需要添加或定制消息转换器,通过实现 WebMvcConfigurer
接口,并重写 configureMessageConverters
方法来添加或修改默认的消息转换器。这对于 REST API 开发尤其重要,你可能需要自定义 JSON 或 XML 的序列化和反序列化过程:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 这里可以添加自定义的消息转换器
// converters.add(new MyCustomMessageConverter());
// 注意:如果你添加自己的转换器,确保不要调用默认转换器,除非你确实需要它们。
// 调用 super.configureMessageConverters(converters) 会添加默认的转换器。
}
}
5. 异常处理
虽然 SpringBoot 提供了默认的错误处理,但你可以通过注册 ErrorController
或 @ControllerAdvice
来自定义错误响应。例如,可以创建一个用于捕获特定异常的 @ControllerAdvice
:
@ControllerAdvice
public class MyGlobalExceptionHandler {
@ExceptionHandler(value = MyCustomException.class)
public ResponseEntity<Object> handleCustomException(MyCustomException ex, WebRequest request) {
// 处理异常
return new ResponseEntity<>(...);
}
}
以上示例展示了如何在 SpringBoot 中自定义和扩展 WebMVC 的各个方面。记住,尽管 SpringBoot 提供了许多默认的配置和自动化支持,但它也设计有足够的灵活性,允许开发者根据具体需求进行定制和优化。
这次先到这里,后续会对 SpringMVC 包含的组件继续进行介绍。