高级 Java 配置
@EnableWebMvc 导入了 DelegatingWebMvcConfiguration,它:
- 为 Spring MVC 应用程序提供默认的 Spring 配置。
- 检测并委派给
WebMvcConfigurer实现以自定义该配置。
对于高级模式,您可以移除 @EnableWebMvc 并直接继承 DelegatingWebMvcConfiguration,而不是实现 WebMvcConfigurer,如下例所示:
java
@Configuration
public class WebConfiguration extends DelegatingWebMvcConfiguration {
// ...
}kotlin
@Configuration
class WebConfiguration : DelegatingWebMvcConfiguration() {
// ...
}您可以保留 WebConfig 中现有的方法,但现在您还可以重写基类中的 bean 声明,并且在类路径上仍然可以拥有任意数量的其他 WebMvcConfigurer 实现。
补充教学
1. 这种模式与 WebMvcConfigurer 的区别?
- WebMvcConfigurer: 就像是给现成的机器“加配件”。你只需实现接口,Spring 就会调用你的回调方法来修改现有配置。
- DelegatingWebMvcConfiguration: 则是“接管这台机器”。通过继承它,你可以通过
@Bean注解重写父类中定义的底层组件(如RequestMappingHandlerMapping或HandlerExceptionResolver)。
2. 什么时候应该使用它?
只有当你发现 WebMvcConfigurer 提供的方法已经无法满足你的定制需求,或者你需要手动控制某些核心 Bean 的创建逻辑时,才考虑使用这种模式。对于 95% 的应用来说,使用接口方式已经绰绰有余。
3. 注意点
直接继承 DelegatingWebMvcConfiguration 会导致 @EnableWebMvc 失效。不要在同一个配置类上同时使用这两者,否则会导致配置冲突或重复注册。