Spring bean的循环引用问题
循环依赖:两个或两个以上的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经历完整的生命周期后,创建成功。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了