Spring Boot 3.x应用初始化同一Bean多次问题排查求助
开启Spring核心日志追踪
把org.springframework.beans.factory和org.springframework.context的日志级别设为DEBUG,能完整看到每个Bean的创建触发方、初始化全流程。比如在application.yml里配置:logging: level: org.springframework.beans.factory: DEBUG org.springframework.context: DEBUG从日志里可以定位每次Bean初始化的调用栈,找到触发源头。
检查测试上下文加载策略
查看测试类是否使用@DirtiesContext注解,若classMode设为AFTER_EACH_TEST_METHOD,每个测试方法都会重建上下文,导致Bean反复初始化。同时排查测试类是否被重复执行、嵌套测试是否存在上下文配置共享错误。梳理Bean作用域与依赖链
即使是单例Bean,若被原型Bean依赖,或依赖链中存在循环结合作用域的冲突,可能触发意外实例化。另外检查自定义的BeanPostProcessor、FactoryBean,确认是否存在逻辑错误导致重复创建Bean。监控上下文刷新事件
实现ApplicationListener<ContextRefreshedEvent>监听器,在事件触发时打印上下文ID和时间戳,判断是否存在Spring上下文被多次启动的情况——这是系统性重复初始化的常见根源。排查测试框架集成问题
比如JUnit 5+Spring Boot Test组合中,检查是否存在测试扩展重复注册、自定义测试规则导致上下文重复加载的情况。验证测试类上的注解组合,比如@SpringBootTest与@ContextConfiguration是否存在配置冲突。验证AOP/动态代理的影响
临时关闭AOP配置,观察问题是否消失。若与AOP相关,排查自定义Advisor、Pointcut的匹配范围,或代理创建逻辑是否重复触发了目标Bean的实例化。检查Bean定义重复注册
自定义BeanDefinitionRegistryPostProcessor,在Bean注册阶段打印每个Bean定义的来源,确认是否存在同一Bean被不同配置类、自动扫描流程重复注册的情况。
内容的提问来源于stack exchange,提问作者Brad Nelson

