You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:06:23