Spring WebMvcConfigurer执行两次异常问题排查求助
Hey there! 作为Spring新手碰到这种配置类重复执行的问题确实挺困惑的,我帮你梳理几个常见的原因和排查方向,结合你给出的信息来分析:
可能导致
WebConfig执行两次的原因及解决办法 1. 配置类被多次组件扫描覆盖
Spring容器初始化时,如果你的WebConfig被多个组件扫描路径包含,就会被重复实例化。比如:
- 你的启动类(比如带
@SpringBootApplication的类)的scanBasePackages已经包含了br.com.cmabreu.config,但其他配置类又额外加了@ComponentScan指定这个包 - 或者项目中存在多个根配置类,都扫描了同一个包路径
解决办法:
- 统一组件扫描范围,确保
br.com.cmabreu.config只被扫描一次 - 可以给
WebConfig加上@ConditionalOnMissingBean注解,强制避免重复实例化:
@EnableWebMvc @Configuration @ConditionalOnMissingBean(WebConfig.class) public class WebConfig implements WebMvcConfigurer { // 你的配置逻辑 }
2. SecurityWebApplicationInitializer引发的双容器初始化
你提到的SecurityWebApplicationInitializer继承自AbstractSecurityWebApplicationInitializer,在传统Spring Web项目(非Spring Boot)中,这个初始化器会独立触发Spring容器的初始化。如果同时你还有另一个WebApplicationInitializer实现类(比如用来注册DispatcherServlet的),就会创建两个容器实例,进而导致WebConfig被加载两次。
排查&解决:
- 如果你用的是Spring Boot项目,完全不需要手动写
SecurityWebApplicationInitializer,Spring Boot会自动完成Security的初始化配置,直接删掉这个类,改用@EnableWebSecurity注解配置Security即可 - 如果是传统Spring Web项目,让
SecurityWebApplicationInitializer明确指定根配置类,避免重复扫描:
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[]{WebConfig.class}; // 明确绑定根配置,避免重复加载 } }
3. @EnableWebMvc的重复使用
@EnableWebMvc会导入DelegatingWebMvcConfiguration来初始化Web MVC配置,如果项目中除了WebConfig,还有其他配置类也标注了@EnableWebMvc,会导致Web MVC配置逻辑被多次触发,连带WebConfig的代码执行两次。
排查&解决:
- 全局搜索项目中的
@EnableWebMvc注解,确保只有WebConfig这一个类标注了它
4. Profile或多环境配置的冲突
如果你的项目使用了Spring Profile,可能存在多个激活的Profile都匹配WebConfig的@Profile注解,或者配置文件中重复指定了加载这个配置类。
排查&解决:
- 检查
WebConfig是否加了@Profile,确认只有目标Profile会加载它 - 清理
application.properties/application.yml中重复的配置类引用
内容的提问来源于stack exchange,提问作者Magno C
相关产品推荐
相关产品推荐

