简单叙述 Spring 是如何解决循环依赖问题的呢?

文章目录

什么是循环依赖?

首先,我们得知道什么是循环依赖。想象一下,如果有两个小朋友,小明和小红,小明说:"小红是我的好朋友。"然后小红说:"小明也是我的好朋友。"这就是一个简单的循环依赖的例子。在Spring框架中,如果两个或多个bean互相依赖对方,就形成了循环依赖。

为什么Spring要解决循环依赖?

循环依赖可能会导致一些问题,比如在创建bean的时候,如果一个bean还没创建好,另一个依赖它的bean就无法完成创建,这会导致程序无法正常运行。所以,Spring需要一种机制来解决这个问题。

Spring是如何解决循环依赖的?

Spring采用了两种主要的方式来解决循环依赖:

  1. 三级缓存机制:Spring容器在创建bean的时候,会使用一个三级缓存机制来跟踪bean的创建状态。这个机制包括:

    • 一级缓存(singletonObjects):存放已经创建好的单例bean。
    • 二级缓存(earlySingletonObjects):存放提前暴露的bean,也就是还没完全创建好的bean。
    • 三级缓存(singletonFactories):存放bean工厂对象,用于创建bean。

    当Spring尝试创建一个bean时,如果发现这个bean依赖了另一个正在创建的bean,它就会使用三级缓存来解决这个问题。

  2. 依赖注入时机:Spring有两种依赖注入的方式,一种是构造器注入,另一种是setter注入。对于构造器注入,Spring会确保所有依赖的bean在当前bean创建之前已经创建好。而对于setter注入,Spring会在bean创建后,再注入依赖的bean,这为解决循环依赖提供了可能。

具体过程是这样的:

  1. 创建bean:当Spring要创建一个bean时,它会先检查这个bean是否已经创建过。
  2. 检查依赖:如果这个bean依赖了其他bean,Spring会先去创建那些依赖的bean。
  3. 使用三级缓存:如果依赖的bean也依赖了当前bean,Spring会使用三级缓存来解决这个问题。它会先创建一个半成品bean(即没有完全初始化的bean),然后通过三级缓存提供给依赖它的bean使用。
  4. 完成bean创建:当所有依赖都解决后,Spring会完成当前bean的创建,并将其放入一级缓存中。

结论

通过这种巧妙的设计,Spring成功地解决了循环依赖的问题,让开发者可以更加方便地构建复杂的应用,而不用担心bean之间的依赖问题。这就是Spring的魔力所在,它让复杂的依赖关系变得简单,让开发者可以更专注于业务逻辑的实现。

推荐阅读文章

相关推荐
wand codemonkey31 分钟前
SpringbootWeb【入门】+MySQL【安装】+【DataDrip安装 】+【连接MySQL】
java·mysql·mybatis
Mahir088 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
RyFit10 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码10 小时前
C++ 内存分区 堆区
java·开发语言·c++
绝知此事10 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
无风听海10 小时前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠11 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
德思特12 小时前
从 Dify 配置页理解 RAG 的重要参数
java·人工智能·llm·dify·rag
YOU OU12 小时前
Spring IoC&DI
java·数据库·spring
один but you12 小时前
从可变参数到 emplace:现代 C++ 性能优化的核心组合
java·开发语言