Spring 中的循环依赖
A 实例依赖 B 实例,B 实例依赖 C 实例,C 实例依赖 A 实例,依赖关系形成一个环,就称为循环依赖。
protoType 作用域的循环依赖:循环依赖是对于单例来说的,spring 容器对于 protoType 作用域的 bean 不进行缓存,因此无法完成依赖注入
构造器循环依赖(单例):始终都在等待依赖创建成功,陷于死循环,无法解决。
setter 循环依赖(单例):在 bean 实例创建成功还未进行注入时,创建一个可以得到这个 bean 的 ObjectFatory,并将这个 ObjectFatory 加入缓存。注入依赖时就去缓存中找。
<bean id="a" class="ClassA"/>
<bean id="b" class="ClassB">
<property name="aref" ref="a" />
</bean>
<bean id="sysinit" class="SystemInit">
<bean id="manager" class="CacheManager" depends-on="sysinit"/>
XML 中的 ref 关系指的就是上文提到的依赖关系,依赖的 bean 是当前 bean 的属性。
但有时候依赖关系并不会这么明显,但又确实存在,这时可以使用 depend-on。depend-on 依赖不允许形成闭环。