文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring循环依赖详解(看这篇就够了)

2024-11-29 19:20

关注

循环依赖:就是多个bean之间相互依赖,形成了一个闭环。

比如:A依赖于B、B依赖于A,如下图所示:

图片

体现到代码中为:

@Component
public class A{
   // 依赖B
   @Autowired
   private B b;
   public B getB() {
      return b;
   }
}


@Component
public class B {
   // 依赖A
   @Autowired
   private A a;
   public A getA() {
      return a;
   }
}

Spring的循环依赖过程:

这样反复就进入了死循环了。

Spring如何解决循环依赖

下面我还是用A -> B -> A的场景,我们按照过程一步步来分析,看一下Spring是如何解决循环依赖的。

第一步:首先是实例化A

图片

第二步:属性注入B

执行到属性填充环节需要注入B,因为Spring管理的bean默认是单例的,为防止重复创建Spring会先去容器中查找B,如果查找不到再进行创建。

如果Spring容器中是没有B,需要先实例化B,流程和实例化一致,如下图所示:

图片

第三步:属性注入A

此时B也执行到属性填充的环节了,此时又需要注入A,此时还是会先去Spring容器中查找A,此时的A虽然没在单例池中,但是因为在创建中并且也在三级缓存中了。

所以此时获取A的流程就发生了变化,不再是直接创建,而是会从三级缓存中获取A,如下图所示:

图片

三级缓存存放的并不是bean对象,而是生成bean的ObjectFactory,然后放入二级缓存中,同时返回A进行依赖注入。

第四步:初始化B

此时,继续执行B的实例化, 并将B从正在创建列表移出 , 将B放入一级缓存,同时将B在二级缓存和三级缓存中删,最后返回B。

图片

在B实例化完成并返回后,A的实例化流程也从等待着苏醒继续执行,后续流程和B的完全一致。

图片

然后整个流程:A -> B -> A的场景就结束了。

这样Spring通过三级缓存来解决循环依赖的,提前暴露的对象存放在三级缓存中,二级缓存存放过渡bean,一级缓存存放最终形态的bean。

Spring三级缓存

// 从上至下 分表代表这“三级缓存”
private final Map singletonObjects = new ConcurrentHashMap<>(256); //一级缓存
private final Map earlySingletonObjects = new HashMap<>(16); // 二级缓存
private final Map> singletonFactories = new HashMap<>(16); // 三级缓存

1.三级缓存(singletonFactories)

singletonFactories:单例对象工厂的cache,存放 bean 工厂对象,用于解决循环依赖。

2.二级缓存(earlySingletonObjects)

主要存放过渡bean,也就是三级缓存中ObjectFactory产生的对象。

提前曝光的单例对象的cache,存放原始的 bean 对象:尚未填充属性,用于解决循环依赖。

3.一级缓存(singletonObjects)

也被称为单例池,去存放已经创建完成,并且属性也注入完毕的对象,一般情况我们获取bean都是从这里获取的。

来源:mikechen的互联网架构内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯