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

Spring Boot启动提示SecurityConfiguration循环依赖如何排查

问题现象

Spring Boot应用启动失败,核心报错如下:

***************************
APPLICATION FAILED TO START
***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

┌──->──┐
|  securityConfiguration
└──<-──┘

从依赖环结构可以判断,securityConfiguration这个Bean存在自依赖,没有其他Bean参与循环。

根因分析

这种单Bean自循环完全是Security配置类编写不规范导致的,高频触发场景有三种:

  • 配置类自身通过构造注入、字段注入的方式,引入了本类中通过@Bean注解声明的组件。Spring创建SecurityConfiguration实例时需要先拿到被注入的Bean,而这个Bean本身又要靠SecurityConfiguration类的配置方法生成,直接形成自引用闭环。
  • 配置类中声明Bean的方法,直接调用同类下其他@Bean方法获取依赖,没有通过Spring容器获取实例,在配置类代理未生效的场景下会触发自循环。
  • 配置类上叠加了重复的注册注解,比如同时标注@Configuration和@Component,导致类被重复扫描注册,注册过程中产生自引用。
排查解决步骤

按以下顺序排查即可快速定位问题:

  1. 排查类内所有注入点
    检查SecurityConfiguration中所有@Autowired标注的字段、构造函数入参,只要注入的对象类型是本类里用@Bean声明的,全部删除类层面的注入,把依赖挪到需要用到它的@Bean方法的参数列表上,Spring会自动从容器完成注入,示例:

    错误写法(触发自循环):

    @Configuration
    @EnableWebSecurity
    public class SecurityConfiguration {
        // 错误:注入本类声明的Bean
        @Autowired
        private PasswordEncoder passwordEncoder;
    
        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    
        @Bean
        public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
            // 调用类层面注入的passwordEncoder做配置
            return http.build();
        }
    }
    

    正确写法:

    @Configuration
    @EnableWebSecurity
    public class SecurityConfiguration {
        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    
        @Bean
        // 需要的依赖直接写在方法参数上,无需类层面注入
        public SecurityFilterChain securityFilterChain(HttpSecurity http, PasswordEncoder passwordEncoder) throws Exception {
            return http.build();
        }
    }
    
  2. 排查@Bean方法内部调用
    遍历所有@Bean修饰的方法,如果方法内部直接调用了同类的其他@Bean方法获取依赖,统一改成方法参数注入的形式,不要直接调用方法。
  3. 排查类上的注解
    Security配置类只需要保留@Configuration、@EnableWebSecurity等必要的安全配置注解,删掉多余的@Component、@Service等会触发组件扫描的注解,避免Bean重复注册。
  4. 注意:Spring Boot 2.6+版本默认关闭循环依赖兼容,不要通过配置spring.main.allow-circular-references=true绕过问题,上述三步排查完必然能找到具体的自依赖点,强行开启兼容只是掩盖问题,后续运行时会出现不可预期的组件注入错误。

内容的提问来源于stack exchange,提问作者Oscar Cai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:45:38