Spring Boot应用部署失败 报无法解析的Bean循环引用错误
问题根因
一开始判断Repository实例为null属于排查方向错了,这个报错和Repository空指针没有关系,核心是Spring启动时出现了无法自动解决的循环依赖,异常栈里明确标注了Is there an unresolvable circular reference?,问题根源出在安全配置类的写法上。
当前的依赖死锁逻辑非常清晰:
- Spring创建
WebSecurityConfig这个配置类Bean时,会先处理所有标了@Autowired的属性和方法,也就是需要先注入UserDetailsService实例、执行configureGlobal初始化方法 - 创建
UserDetailsService对应的实现类、以及异常栈里提到的userAuthentificationServiceImpl时,需要注入BCryptPasswordEncoder类型的Bean - 但
BCryptPasswordEncoder的Bean原本定义在还没完成初始化的WebSecurityConfig里,Spring拿不到可用的完整实例,两边互相等待对方初始化完成,直接卡死抛出异常。
另外你在configureGlobal方法里直接调用同类下的bCryptPasswordEncoder()方法获取编码器实例,相当于配置类自身还没初始化完成,就提前尝试获取它内部定义的Bean,这也是直接触发BeanCurrentlyInCreationException的直接诱因。
修复步骤
按下面的要求修改完代码,应用就能正常启动:
- 把
BCryptPasswordEncoder的Bean定义单独挪到一个独立的配置类中,不要和Web安全配置放在同一个类里,从根源上切断循环依赖的链路:
@Configuration public class PasswordEncoderConfig { @Bean public BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(); } }
- 删掉
WebSecurityConfig里原本写的bCryptPasswordEncoder()方法,修改configureGlobal方法的写法,不要手动调用类内方法获取编码器,改为通过方法参数声明依赖,让Spring自动从容器中注入已经初始化完成的实例:
@Autowired public void configureGlobal(AuthenticationManagerBuilder auth, BCryptPasswordEncoder bCryptPasswordEncoder) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder); }
- 检查异常栈里提到的
userAuthentificationServiceImpl类(你贴代码时没有附上这个类的内容),确认它注入BCryptPasswordEncoder时使用@Autowired做自动注入,不要手动new实例,也不要通过直接调用配置类方法的方式获取Spring管理的Bean。
补充说明
你贴出的Repository层代码、UserAuthentificationDetailsServiceImpl实现类的代码本身没有注入问题,之前查到的“手动实例化Service导致Repository为null”的常见错误在这部分代码里不存在,不需要在这两块内容上浪费时间排查。
你提到的安全配置类长导入语句换行的问题属于排版显示问题,不会影响代码实际运行,不需要额外处理。
内容的提问来源于stack exchange,提问作者metatrone
相关产品推荐
相关产品推荐

