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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:54:02