深入理解Spring Boot中SpringMVC自动配置原理
Spring Boot为SpringMVC提供了开箱即用的自动配置能力,这主要得益于WebMvcAutoConfiguration类的设计。本文将详细拆解这些默认配置的核心机制和自定义扩展方式。
核心自动配置组件
自动配置主要包含以下关键模块:
- 视图解析器:自动注册
ContentNegotiatingViewResolver和BeanNameViewResolver。前者是一个组合视图解析器,将多个解析器统一调度。开发者通过添加自定义ViewResolverBean 即可扩展。 - 静态资源:支持WebJars资源映射,默认静态文件夹路径,以及
index.html和favicon.ico的处理。 - 类型转换与格式化:自动注册
Converter、GenericConverter、FormatterBean。例如通过spring.mvc.date-format属性即可控制日期格式化。
@Bean
@ConditionalOnProperty(prefix = "spring.mvc", name = "date-format")
public Formatter<Date> dateFormatter() {
return new DateFormatter(this.mvcProperties.getDateFormat());
}
开发者自定义的格式化器和转换器只需注册到容器即可被自动集成。
- 消息转换器:
HttpMessageConverters负责HTTP请求/响应与Java对象之间的转换(如JSON序列化)。所有容器中的HttpMessageConverter都会被统一收集。 - 其他组件:包括
MessageCodesResolver(错误码生成规则)和ConfigurableWebBindingInitializer(数据绑定初始化器)。
上述配置位于 org.springframework.boot.autoconfigure.web 包中,涵盖大多数Web场景。
扩展SpringMVC配置
要保留自动配置的同时添加自定义功能(如拦截器、视图控制器等),推荐继承 WebMvcConfigurerAdapter 并标注 @Configuration,但不要使用 @EnableWebMvc。
@Configuration
public class CustomMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/home").setViewName("dashboard");
}
}
其原理是:WebMvcAutoConfiguration 通过 @Import(EnableWebMvcConfiguration.class) 引入一个配置类,该类会收集容器中所有 WebMvcConfigurer 实现,并逐一调用。因此自动配置和自定义配置会共同生效。
全面接管SpringMVC
若需要完全控制SpringMVC,禁用自动配置,只需在配置类上添加 @EnableWebMvc 注解。
@EnableWebMvc
@Configuration
public class FullControlMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/about").setViewName("about-page");
}
}
原理分析:
@EnableWebMvc内部通过@Import(DelegatingWebMvcConfiguration.class)导入了WebMvcConfigurationSupport。WebMvcAutoConfiguration的关键条件注解@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)会检测到该Bean已存在,从而跳过自动配置。- 最终仅保留SpringMVC最基本的功能,所有高级自动配置全部失效。
实际开发中建议优先使用扩展方式,仅在需要深度定制时采用全面接管方案。