Spring中循环依赖解决方法

转载于:循环依赖解决

循环依赖产生原因:两个及两个以上的bean相互包含彼此。
涉及到的知识点:bean的生命周期,bean的依赖注入方式。

首先我们知道bean有两种依赖注入方式:构造器注入和setter注入,而setter方式注入有分为单例(singleton)和原型(prototype)注入。构造器注入和setter注入的原理是不同的。

构造器注入

Spring容器会将每一个正在创建的 Bean 标识符放在一个“当前创建Bean池”中,Bean标识符在创建过程中将一直保持在这个池中,因此如果在创建Bean过程中发现自己已经在“当前创建Bean池”里时将抛出BeanCurrentlyInCreationException异常表示循环依赖;而对于创建完毕的Bean将从“当前创建Bean池”中清除掉。

setter注入(单例)

Spring中循环依赖解决方法
如图中前两步骤得知:Spring是先将Bean对象实例化之后再设置对象属性的。
我们结合上面那张图看,Spring先是用构造实例化Bean对象 ,此时Spring会将这个实例化结束的对象放到一个Map中,并且Spring提供了获取这个未设置属性的实例化对象引用的方法。也就是说当一个bean实例化完成后,第二步给他进行属性赋值,这时候spring就会在Map中找所需的单例对象,这样就不会发生循环引用出错问题。