一、循环依赖类型
1. 直接依赖@b@• 表现为A依赖B,同时B依赖A。@b@• 在图中用两个圆圈A和B表示,箭头从A指向B,再从B指向A。@b@@b@2. 间接依赖@b@• 表现为A依赖B,B依赖C,C依赖A。@b@• 在图中用三个圆圈A、B、C表示,箭头从A指向B,从B指向C,从C指向A。@b@@b@3. 自我依赖@b@• 表现为A依赖A自身。@b@• 在图中用一个圆圈A表示,箭头从A指向A。
二、Spring的三级缓存
1. 一级缓存(singletonObjects)@b@• 作用:存储完全初始化好的Bean。@b@• 在图中用绿色方块表示,文字说明为“存储完全初始化好的Bean”。@b@@b@2. 二级缓存(earlySingletonObjects)@b@• 作用:存储原始实例,即还未完全初始化的Bean。@b@• 在图中用蓝色方块表示,文字说明为“存储原始实例,即还未完全初始化的Bean”。@b@@b@3. 三级缓存(singletonFactories)@b@• 作用:存储ObjectFactory,用于生成Bean的代理对象或原始对象。@b@@b@• 在图中用粉色方块表示,文字说明为“存储ObjectFactory,用于生成Bean的代理对象或原始对象”。
三、循环依赖解决流程
1. 初始化BeanA@b@• 首先从一级缓存查找BeanA,未找到。@b@• 然后创建实例(未初始化),并将其放入三级缓存。@b@@b@2. 依赖注入BeanB@b@• 从一级缓存查找BeanB,未找到。@b@• 创建实例(未初始化),并将其放入三级缓存。@b@@b@3. 依赖注入BeanA@b@• 从三级缓存查找BeanA,找到后将其放入二级缓存,并从三级缓存移除。@b@• 将不完全的BeanA注入到BeanB中。@b@@b@4. BeanA注入BeanB实例@b@•BeanB完成属性填充,执行完初始化并放入一级缓存。@b@@b@5. BeanA完成属性填充@b@• BeanA完成属性填充,执行完初始化并放入一级缓存。
通过这种三级缓存机制,Spring能够有效地解决循环依赖问题,确保Bean的正确创建和初始化。