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

Spring Boot应用上下文Bean循环依赖报错求助

循环依赖问题分析与修复

问题原因

从错误日志可明确,UserServiceImpl与SecurityConfig形成了循环依赖:

  • SecurityConfig初始化时需要注入UserDetailsService(其实现类为UserServiceImpl)
  • UserServiceImpl初始化时需要注入PasswordEncoder,而该Bean定义在SecurityConfig中

两者互相等待对方完成初始化,导致Spring无法正常创建Bean实例。

修复步骤

1. 将PasswordEncoder拆分到独立配置类(推荐方案)

把PasswordEncoder的Bean定义从SecurityConfig迁移到单独的配置类(比如AppConfig),让两个类都依赖这个独立Bean,直接打破循环:

@Configuration
public class AppConfig {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

2. 延迟加载PasswordEncoder(快速临时修复)

若不想拆分配置类,可在UserServiceImpl中对PasswordEncoder添加@Lazy注解,让Spring延迟初始化该依赖,避免初始化阶段的循环冲突:

@Service
@RequiredArgsConstructor
@Slf4j
public class UserServiceImpl implements UserService, UserDetailsService {
    private final UserRepository userRepository;
    @Lazy // 添加该注解实现延迟加载
    private final PasswordEncoder passwordEncoder;

    // 其余业务代码保持不变
}

3. 清理重复的AuthenticationManager Bean

你的SecurityConfig中定义了两个AuthenticationManagerBean,这会导致Spring无法确定使用哪一个,建议保留基于AuthenticationConfiguration的实现,删除重复定义:

@EnableWebSecurity
@Configuration
@RequiredArgsConstructor
public class SecurityConfig {
    private final UserDetailsService userDetailsService;
    private final AuthenticationConfiguration authenticationConfiguration;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    // 删除以下重复的AuthenticationManager Bean定义
    // @Bean
    // AuthenticationManager authenticationManager(AuthenticationManagerBuilder auth) throws Exception {
    //     return auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()).and().build();
    // }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests().anyRequest().permitAll();
        http.addFilter(new CustomAuthenticationFilter(authenticationManagerBeans()));
        return http.build();
    }

    @Bean
    public AuthenticationManager authenticationManagerBeans() throws Exception
    {
        return authenticationConfiguration.getAuthenticationManager();
    }
}

额外提醒

UserServiceImpl中给用户分配权限的逻辑存在问题:直接将applicationId作为权限字符串不符合Spring Security的权限规范(通常权限以ROLE_开头,比如ROLE_USER),建议后续调整为基于用户角色的权限分配逻辑,避免后续权限控制出现异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 06:16:20