首先先解释一下什么叫循环依赖
循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环.比如A依赖于B,B依赖于A
循环依赖在spring中是允许存在的,spring框架依据三级缓存已经解决了大部分的循环依赖
一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象
二级缓存:缓存早期的bean对象(声明周期还没有走完)
三级缓存:缓存的是ObjectFactory,标识对象工厂,用来创建某个对象的
spring通过三级缓存来解决循环依赖的问题,具体解决过程如下:
1.创建对象:当Spring容器创建一个Bean时,会先创建一个空的对象,并将其到"singletonFactories"缓存中.
2.属性注入:spring会将该对象的属性注入到其他依赖的Bean中
3.提前暴露:在属性注入完成后,Spring会将该对象提前暴露给其他的Bean,以便其他的Bean可以引用到该对象.
4.初始化:Spring会调用该对象的初始化方法.
5.缓存对象:当该对象初始化完成后,Spring会将该对象放入到earlySingletonObjects缓存中.
6.循环依赖检测:在创建其他bean时,如果发现有循环依赖的情况,spring会从singletonFactories缓存中获取之前创建的空对象,并将其返回给依赖的bean.
7.属性充值:当循环依赖的bean被返回后,Spring会继续填充bean的属性
8初始化完成:当所有的bean的属性填充完成后,spring会调用这些bean的初始化方法.
通过以上步骤,spring能够解决循环依赖的问题,确保所有Bean都能够正确地创建和初始化
循环依赖问题AI智能回答
循环依赖报错信息
循环依赖解决流程图
循环依赖进一步追问