当前位置:首页 > 科技  > 软件

想进阿里?先搞懂Spring Bean的循环依赖!

来源: 责编: 时间:2024-03-18 09:38:37 306观看
导读引言嗨,小伙伴们!我是小米,你们的技术分享小助手!今天我们要聊的话题可是技术圈内颇为热门的“阿里巴巴面试题:Spring的循环依赖”哦!相信很多小伙伴都会在技术面试中遇到类似的问题,没错,循环依赖是一个挑战性很高的问题,但是

引言

嗨,小伙伴们!我是小米,你们的技术分享小助手!今天我们要聊的话题可是技术圈内颇为热门的“阿里巴巴面试题:Spring的循环依赖”哦!相信很多小伙伴都会在技术面试中遇到类似的问题,没错,循环依赖是一个挑战性很高的问题,但是只要你掌握了相关知识,就能够游刃有余地解决它。那么,让我们一起来深入了解一下吧!XZG28资讯网——每日最新资讯28at.com

图片图片XZG28资讯网——每日最新资讯28at.com

什么是循环依赖?

循环依赖,作为软件开发中常见的问题之一,指的是两个或多个组件之间形成了相互依赖的关系,最终形成一个循环。在编程领域中,这种情况可能会导致程序运行时出现一系列难以预料的问题,比如死锁、无限递归等。XZG28资讯网——每日最新资讯28at.com

循环依赖通常出现在对象之间相互引用的场景中。举个简单的例子,假设有两个类A和B,A中引用了B,而B中又引用了A,这样就形成了循环依赖。在实际开发中,循环依赖可能会导致程序的初始化顺序混乱,或者造成内存泄漏等问题。XZG28资讯网——每日最新资讯28at.com

Spring中循环依赖场景XZG28资讯网——每日最新资讯28at.com

在Spring框架中,循环依赖是指两个或多个Bean之间存在相互依赖的情况,这在日常开发中是比较常见的。下面我们来详细了解一下在Spring中的循环依赖场景以及可能的解决方案。XZG28资讯网——每日最新资讯28at.com

首先,让我们看看Spring中几种典型的循环依赖场景:XZG28资讯网——每日最新资讯28at.com

  • Prototype原型Bean循环依赖:当一个Bean的作用域为prototype(原型)时,Spring容器在初始化时会为每次请求创建一个新的实例。如果两个prototype Bean相互依赖,那么就会出现循环依赖的情况。
  • 构造器的循环依赖(构造器注入):在构造器注入中,如果Bean A依赖于Bean B,而Bean B又依赖于Bean A,那么就会形成构造器的循环依赖。
  • Field属性的循环依赖(set注入):在使用set方法进行属性注入时,如果两个Bean相互依赖,也会导致循环依赖的问题。

以上这些场景都有可能导致Spring容器在初始化Bean时出现循环依赖的情况,从而引发一系列问题,比如Bean无法正常初始化、内存溢出等。XZG28资讯网——每日最新资讯28at.com

其中,构造器的循环依赖问题无法解决,在解决属性循环依赖时,可以使用懒加载,spring采用的是提前暴露对象的方法。XZG28资讯网——每日最新资讯28at.com

懒加载解决循环依赖问题

懒加载(Lazy initialization)是Spring框架提供的一种解决循环依赖问题的有效策略之一,其中通过使用@Lazy注解来延迟Bean的初始化过程。在循环依赖的情况下,如果两个Bean相互依赖,可能会导致初始化过程中出现死锁或无限递归等问题。通过懒加载的方式,Spring容器会将Bean的初始化推迟到第一次被调用时才进行,从而避免了循环依赖导致的初始化问题。XZG28资讯网——每日最新资讯28at.com

举例来说,假设我们有两个Bean:Bean A 和 Bean B,它们相互依赖。通过在Bean的定义中添加@Lazy注解,告诉Spring容器在初始化时不要立即创建Bean的实例,而是等到需要使用该Bean时再进行初始化。这样可以确保Bean在初始化过程中不会出现循环依赖的问题。XZG28资讯网——每日最新资讯28at.com

虽然懒加载能够有效解决循环依赖问题,但也需要注意一些潜在的性能影响。因为每次使用Bean时都需要进行初始化,所以可能会增加一定的延迟和资源消耗。因此,在使用懒加载时需要根据具体情况权衡考虑,选择合适的解决方案。XZG28资讯网——每日最新资讯28at.com

三级缓存解决循环依赖问题

三级缓存是Spring框架用来解决循环依赖问题的重要机制之一。在面对循环依赖的情况下,Spring会使用三级缓存来管理Bean的创建过程,确保循环依赖不会导致程序出现异常或无限递归。XZG28资讯网——每日最新资讯28at.com

这个机制涉及到三个缓存阶段:singletonObjects、earlySingletonObjects和singletonFactories。XZG28资讯网——每日最新资讯28at.com

首先,当Spring容器创建Bean时,会将正在创建的Bean放入singletonFactories缓存中。接着,Spring会调用Bean的构造函数创建实例,并将实例放入earlySingletonObjects缓存中,此时Bean还未完全初始化,可能存在一些未完成的依赖。最后,Spring会完成Bean的初始化,解决所有的依赖关系,并将完全初始化的Bean放入singletonObjects缓存中。XZG28资讯网——每日最新资讯28at.com

当另一个Bean依赖正在创建的Bean时,Spring会先从singletonObjects缓存中尝试获取Bean的实例,如果获取不到,则会从earlySingletonObjects缓存中获取。如果依然无法获取到,则说明Bean还未完全初始化,此时Spring会检查singletonFactories缓存中是否有正在创建的Bean的工厂实例。如果有,则会等待Bean的完全初始化,从而解决循环依赖。XZG28资讯网——每日最新资讯28at.com

如果检测到循环依赖无法解决,Spring会抛出相应的异常,比如BeanCurrentlyInCreationException,通知开发者存在循环依赖问题。XZG28资讯网——每日最新资讯28at.com

通过三级缓存机制,Spring能够在容器初始化过程中管理Bean的创建顺序,并确保循环依赖不会导致程序出现异常。但是需要注意的是,过多的循环依赖可能会导致性能下降,因此在设计应用程序时应尽量避免过多的循环依赖。XZG28资讯网——每日最新资讯28at.com

为什么是三级缓存而不是二级?

你可能会好奇为什么Spring使用了三级缓存而不是二级。首先,让我们来理解一下什么是二级缓存。在二级缓存的情况下,Spring容器会将正在创建的Bean实例放入一个缓存中,用于管理正在创建的Bean。当另一个Bean需要引用正在创建的Bean时,容器会先从这个缓存中尝试获取Bean的实例,以解决循环依赖的问题。XZG28资讯网——每日最新资讯28at.com

然而,如果仅仅使用二级缓存,可能会遇到一些问题。主要有以下几个方面:XZG28资讯网——每日最新资讯28at.com

  • 无法区分未完成和已完成的Bean实例:二级缓存中存储的是正在创建的Bean实例,但无法区分哪些Bean已经完成了初始化,哪些Bean还处于未完成状态。这可能导致容器无法正确处理循环依赖,因为无法确定依赖的Bean是否已经初始化完成。
  • 缺乏针对性的解决方案:二级缓存只能暂存正在创建的Bean实例,无法提供针对性的解决方案来处理循环依赖。在复杂的场景下,可能需要更多的信息来判断和解决循环依赖问题。

因此,为了解决这些问题,Spring引入了三级缓存机制。三级缓存在二级缓存的基础上增加了一个缓存阶段,即earlySingletonObjects,用于存储已经创建但尚未完成初始化的Bean实例。通过这样的设计,Spring能够更好地管理Bean的创建过程,确保循环依赖不会导致程序出现异常。XZG28资讯网——每日最新资讯28at.com


XZG28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-76495-0.html想进阿里?先搞懂Spring Bean的循环依赖!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: RabbitMQ代码篇之过期时间,死信队列,延迟队列,优先级队列的基本使用

下一篇: 还在用Calendar操作Date?Java8都被放弃了,你还不知道Java8中全新的日期时间API

标签:
  • 热门焦点
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • iPhone卖不动了!苹果股价创年内最大日跌幅:市值一夜蒸发万亿元

    8月5日消息,今天凌晨美股三大指数高开低走集体收跌,道指跌0.41%;纳指跌0.36%;标普500指数跌0.52%。热门科技股也都变化极大,其中苹果报181.99美元,跌4.8%,创
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz“难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?”这一番话,出自百合网联合创
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。“提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 自研Exynos回归!三星Galaxy S24系列将提供Exynos和骁龙双版本

    年初,全新的三星Galaxy S23系列发布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三个版本,全系搭载超频版骁龙8 Gen 2,虽同样采用台积电4nm工艺制
Top