Spring循环依赖发生原因:A类注入B类,B类注入A类,导致bean在初始化时,循环注入,导致谁都无法成功注入成功,如下图
循环依赖产生,所以Spring框架采用三级缓存解决掉了循环依赖问题,Spring三级缓存具体怎么解决的不在本章做过多描述。本章着重讲解一下出现循环依赖的场景和解决方案:
场景1:SpringBoot版本在2.6以上,使用@Autowired注解出现循环依赖问题?
解决方法:application.properties配置文件中增加 spring.main.allow-circular-references=true
或者yaml文件增加
因为SpringBoot2.6以上的版本默认是禁用了循环依赖,所以需要我们自己手动开启,一般不推荐这种解决方式,因为在SpringBoot3.0版本出现了@RequiredArgsConstructor注解,可以用它代替大量的@Autowired注解。
场景2:使用 @RequiredArgsConstructor注入bean,配置也增加 spring.main.allow-circular-references=true了,但还是出现了循环依赖问题,项目启动失败?
解决方法:可以采用懒加载注解方式注入bean,如下图
不再初始化进bean,采用懒加载策略,在使用到之后再进行初始化bean,避免循环依赖
ps:使用懒加载注解注入需要去除final修饰