升级Spring Boot 2.6.0报webSecurityConfig Bean循环引用错误如何解决
问题根因
你遇到的循环引用来自以下依赖闭环:
- WebSecurityConfig 实例化需要先注入UserDetailsService实现类
- 你的UserDetailsService实现类依赖BCryptPasswordEncoder完成密码加密、校验逻辑
- BCryptPasswordEncoder是WebSecurityConfig内部定义的@Bean,要创建该Bean必须先完成WebSecurityConfig的实例化
三者互相依赖形成循环,Spring Boot 2.6默认禁用循环引用后直接触发启动异常。
修复方案
推荐优先选择方案1,从架构层面完全消除循环依赖,是最合规的修复方式:
方案1:将密码编码器拆分到独立配置类
单独创建一个配置类存放密码编码器的Bean定义,完全拆分依赖关系:
@Configuration public class PasswordEncoderConfig { @Bean public BCryptPasswordEncoder bcryptPasswordEncoder() { return new BCryptPasswordEncoder(); } }
然后删除WebSecurityConfig类中的bcryptPasswordEncoder Bean定义方法,调整configureGlobal方法通过参数注入编码器即可:
@Autowired public void configureGlobal(final AuthenticationManagerBuilder auth, BCryptPasswordEncoder encoder) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(encoder); }
方案2:对UserDetailsService添加懒加载注解
如果不想拆分配置类,可以给构造方法注入的UserDetailsService添加@Lazy注解,延迟UserDetailsService的初始化时机,避开实例化阶段的循环依赖:
public WebSecurityConfig(@Lazy final UserDetailsService userDetailsService) { this.userDetailsService = userDetailsService; }
方案3:启用循环引用配置(临时过渡用)
如果只是临时兼容升级,可以在application.yml/properties中添加配置恢复循环引用支持,不推荐长期使用:
spring.main.allow-circular-references = true
内容的提问来源于stack exchange,提问作者Suraj Muraleedharan
相关产品推荐
相关产品推荐

