循环依赖:两个或两个以上的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经历完整的生命周期后,创建成功。
标签:缓存,依赖,Spring,ObjectFactory,bean,循环,引用 From: https://www.cnblogs.com/yhb-blogs/p/17440122.html