Spring是如何实现依赖注入的,又是如何解决解决循环依赖的??
在探索哪些场景会报错之前,让我们先来回顾一下,到底什么是循环依赖
spring 字段注入,相互持有对方引用,造成循环依赖的典型场景
@Service
class A {
@Resource
private B b;
}
@Service
class B {
@Resource
private A a;
}
有的小伙伴们开始想了,这种关系我直接用代码表示出来很简单呀,直接new
出来,然后设置一下值就好了,为什么用spring的方式就出现循环依赖问题了。
java代码解决方案如下
A a = new A();
B b = new B();
//依次注入对方
a.setB(b);
b.setA(a);
对比发现,很容易得出以下结论:spring在ioc进程中,
对象的生成
需要流转复杂的bean生命周期
,这才导致对象互相引用的时候产生了循环依赖
问题。
问题又来了
那什么是bean的生命周期
呢
bean的生命周期,由
主线
和扩展点
构成。
本文章只需了解主线流程即可,其中主线为红色
,扩展点为蓝色
。每个bean对象的生成,都遵循以上过程。
那么,问题显而易见,bean A
创建的时候走到空对象填充值
节点时发现需要填充bean B
,进而去创建bean B
,bean B
创建的时候走到空对象填充值
节点时发现需要填充bean A
,进而去创建bean A
,好家伙,进入死循环了。这就是循坏依赖
。