(1)循环依赖分类
循环依赖一共分为三类,如下图所示:
(2) 循环依赖解决办法
使用三级缓存。
(3)使用三级缓存的原因
假设两个对象A和B相互依赖。
如果使用二级缓存,等同于第二级缓存必须完成实例化和属性注入,两者构成一个事务,换句话说属性注入和实例化同时完成,对象才存在。这样就出现了一个问题,A中需要注入B对象的时候,A需要向IOC容器getBean(B),此时发现B对象并不存在,因此需要构造B对象,同样的实例化和属性注入过程,当B中需要注入A对象的时候,B需要向IOC容器getBean(A),此时发现A对象也并不存在,这样就形成了死循环。
如果使用三级缓存:将实例化和属性注入分开,实例化之后对象就会存在,只不过此时的对象并没有完成属性注入和初始化(赋值),此时的对象是一个完成三分之一的残次品,属性注入完成之后,就得到半残次品对象Bean,初始化之后才会得到一个完整的Bean。使用三级缓存,在属性注入的时候,需要注入其他对象时,至少能找到对方的对象,这样也就解决了死循环的问题。