Spring循环依赖问题
个人理解,有问题欢迎指正。
Spring 生命周期中,首先使用构造方法对 bean 实例化,实例化完成之后才将不完全的 bean放入三级缓存中提前暴露出 bean,然后进行属性赋值,此时容易出现循环依赖问题。
由此可见,Spring 使用三级缓存能够解决循环依赖的场景有:
1.属性赋值-属性赋值
2.先属性赋值-后构造方法
但是以下场景中,由于在构造方法中进行属性注入,此时 beanA 还未被实例化,三个级别的缓存中都不存在该 beanA,此时属性注入过程中创建属性 beanB时找不到循环依赖的bean A,因此而报错。
1.先构造方法-后构造方法
2.先构造方法-后属性复制
例如:
@Service
@AllArgsConstructor
public class CommentServiceImpl{@Resourceprivate IUserService userService;
}@Slf4j
@Service
public class UserServiceImpl{@Resourceprivate IAsyncUserInfoService asyncUserInfoService;
}@Service
public class AsyncUserInfoService{@Resourceprivate ICommentService commentService;
}
解决方法推荐编码解决,也可在其中任意循环节点 bean 注入上加@Lazy 懒加载注解解决,原理是在有@Lazy 注解时,spring容器启动时不创建该bean,而是使用到的时候创建。