SpringBoot循环依赖解决

前言

最近遇到了一个问题,根据idea报错看出了是循环依赖了,导致项目启动失败,下面记录下解决问题的过程

什么是循环依赖

Bean A 依赖 B,Bean B 依赖 A这种情况下出现循环依赖。
Bean A → Bean B → Bean A
更复杂的间接依赖造成的循环依赖如下。
Bean A → Bean B → Bean C → Bean D → Bean E → Bean A

解决方案

最有效的解决方式是增加@Lazy注解,延迟加载,先注入代理对象,当首次使用时再创建对象完成注入,代码如下

1
2
3
4
5
6
private SysMetaObjectService sysMetaObjectService;

@Autowired
public void setSysMetaObjectService(@Lazy SysMetaObjectService sysMetaObjectService) {
this.sysMetaObjectService = sysMetaObjectService;
}

其他网上说的直接用@Autowired注解亦或者是setter注入,发现并不管用,我这里用setter注入加上@Lazy注解才算管用

总结

发生循环依赖首先考虑是不是设计的有问题,为什么会产生循环依赖,这不符合java的低耦合原则,所以最应该考虑的是不是需要解耦,其他再考虑使用延迟加载等方案