Spring bean的循环引用问题

发布时间 2023-05-29 12:42:26作者: 程序员_YHB

循环依赖:两个或两个以上的bean循环引用。例如:A依赖B,B依赖A。

Spring有三种循环依赖问题:

(1)构造器的循环依赖:Spring无法解决构造器的循环依赖问题,但是可以使用@Lazy将bean声明为懒加载,什么时候用到这个bean在创建。

(2)非单例bean的setter循环依赖:Spring无法解决非单例bean的循环依赖问题。

(3)单例bean的setter循环依赖:可以采用三级缓存解决单例bean的setter循环依赖。

一级缓存:缓存经历完整生命周期的bean。

二级缓存:缓存没有经历完整生命周期的bean。

三级缓存:缓存ObjectFactory(对象工厂)。利用ObjectFactory可以创建某个对象。

使用三级缓存解决循环依赖的过程:

(1)调用A的构造器进行bean的实例化。同时将A的ObjectFactory(对象工厂)缓存到三级缓存中。

(2)A进行依赖注入,需要属性B,开始B的创建过程。

(3)调用B的构造器进行bean的实例化。同时将B的ObjectFactory(对象工厂)缓存到三级缓存中。

(4)B进行依赖注入,需要属性A。此时使用三级缓存中A的ObjectFactory生成A的对象缓存到二级缓存中,B从二级缓存中取出属性A注入。

(5)B经过Bean创建的完整生命周期后,B创建成功,将B缓存到一级缓存中。

(6)B已经创建成功,从一级缓存中取出B注入A中。

(7)A经历完整的生命周期后,创建成功。