视频字幕
Spring的循环依赖问题是指两个或多个Bean之间相互依赖,形成一个闭环。例如,Bean A依赖于Bean B,而Bean B又依赖于Bean A。这种情况会导致Bean无法正常创建和初始化。
循环依赖成为问题的根本原因在于Bean的生命周期。Spring需要完全创建并初始化一个Bean才能将其注入到其他依赖它的Bean中。当Bean A需要Bean B,而Bean B又需要Bean A时,就会形成一个无限循环,导致两个Bean都无法被完全创建和初始化。
构造器注入的循环依赖是Spring默认无法解决的。因为使用构造器注入时,Bean A的构造器需要Bean B的实例,而Bean B的构造器又需要Bean A的实例。在调用构造器之前,两个Bean都无法被完全创建,因此Spring会抛出BeanCurrentlyInCreationException异常。
Spring可以通过三级缓存机制解决Setter或字段注入的循环依赖。核心思想是在Bean的生命周期早期,实例化后但在属性注入和初始化之前,将一个早期暴露的Bean引用放入缓存中。当Spring创建Bean B并发现它依赖Bean A时,可以从缓存中获取Bean A的早期引用,注入到Bean B中,然后继续完成Bean B的创建。之后,再回到Bean A,完成其属性注入和初始化。
总结一下Spring循环依赖问题:循环依赖是Bean间相互依赖形成的闭环问题。构造器注入的循环依赖Spring无法解决,会抛出异常。而Setter或字段注入的循环依赖可以通过三级缓存机制解决,利用早期Bean引用来打破循环。在实际开发中,我们应该尽量避免设计出循环依赖的情况。