简单叙述 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的魔力所在,它让复杂的依赖关系变得简单,让开发者可以更专注于业务逻辑的实现。

推荐阅读文章

相关推荐
岁岁岁平安1 分钟前
springboot实战(15)(注解@JsonFormat(pattern=“?“)、@JsonIgnore)
java·spring boot·后端·idea
Oak Zhang2 分钟前
TheadLocal出现的内存泄漏具体泄漏的是什么?弱引用在里面有什么作用?什么情景什么问题?
java·系统安全
数据小小爬虫4 分钟前
如何利用Java爬虫获得1688店铺详情
java·开发语言
天若有情6735 分钟前
c++框架设计展示---提高开发效率!
java·c++·算法
斗-匕7 分钟前
Spring事务管理
数据库·spring·oracle
Reese_Cool24 分钟前
【数据结构与算法】排序
java·c语言·开发语言·数据结构·c++·算法·排序算法
TheITSea1 小时前
云服务器宝塔安装静态网页 WordPress、VuePress流程记录
java·服务器·数据库
AuroraI'ncoding1 小时前
SpringMVC接收请求参数
java
九圣残炎2 小时前
【从零开始的LeetCode-算法】3354. 使数组元素等于零
java·算法·leetcode
天天扭码2 小时前
五天SpringCloud计划——DAY1之mybatis-plus的使用
java·spring cloud·mybatis