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,导致类被重复扫描注册,注册过程中产生自引用。
排查解决步骤
按以下顺序排查即可快速定位问题:
- 排查类内所有注入点
检查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(); } } - 排查@Bean方法内部调用
遍历所有@Bean修饰的方法,如果方法内部直接调用了同类的其他@Bean方法获取依赖,统一改成方法参数注入的形式,不要直接调用方法。 - 排查类上的注解
Security配置类只需要保留@Configuration、@EnableWebSecurity等必要的安全配置注解,删掉多余的@Component、@Service等会触发组件扫描的注解,避免Bean重复注册。 - 注意:Spring Boot 2.6+版本默认关闭循环依赖兼容,不要通过配置
spring.main.allow-circular-references=true绕过问题,上述三步排查完必然能找到具体的自依赖点,强行开启兼容只是掩盖问题,后续运行时会出现不可预期的组件注入错误。
内容的提问来源于stack exchange,提问作者Oscar Cai
相关产品推荐
相关产品推荐

