千家信息网

spring要怎么解决循环依赖

发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,这篇文章主要讲解了"spring要怎么解决循环依赖",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"spring要怎么解决循环依赖"吧!先说结论,spri
千家信息网最后更新 2025年02月05日spring要怎么解决循环依赖

这篇文章主要讲解了"spring要怎么解决循环依赖",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"spring要怎么解决循环依赖"吧!

先说结论,spring通过三级缓存机制来解决循环依赖问题,构造器依赖除外,即构造器注入可能会报错。

循环依赖的情况如下:

首先spring初始化bean的步骤如下:

这里只需要简单的理解为只需要三步:

  1. 实例化

  2. 填充属性(注入依赖)

  3. 初始化完成

spring在创建Bean A的时候会先去一级缓存(singletonObjects),如果一级缓存没有则再从二级缓存(earlySingletonObjects)中获取,如果二级缓存也没有,则再从三级缓存(singletonFactories)中获取,如果还获取不到,则实例化一个A,然后放入三级缓存,然后填充属性,此刻发现依赖B,于是创建B,同样的经过上述步骤,由于每级缓存都获取不到,于是实例化B,然后填充属性,发现依赖A,然后依次去每级缓存中获取,由于三级缓存中已经有一个A,于是B可以顺利注入依赖,并被正确的初始化,然后递归返回,于是A也可以被正确的初始化了。

通过上述说明,可以看出bean都是需要可以先被实例化才可以的,所以这也就是为什么构造器依赖可能会失败的原因。假如A构造器依赖B,因为实例化A需要先调用A的构造函数,发现依赖B,那么需要去初始化B,但是B也依赖A,不管B是通过构造器注入还是setter注入,此时由于A没有被实例化,没有放入三级缓存,所以B无法被初始化,所以spring会直接报错。反之,如果A通过setter注入的话,那么则可以通过构造函数先实例化,放入缓存,然后再填充属性,这样的话不管B是通过setter还是构造器注入A,都能在缓存中获取到,于是可以初始化。

由此可见,循环依赖中,如果spring先去创建的bean通过构造器注入另一个bean则会失败,反之则可以成功。所以这也是为什么一定不好通过构造器注入的原因。

感谢各位的阅读,以上就是"spring要怎么解决循环依赖"的内容了,经过本文的学习后,相信大家对spring要怎么解决循环依赖这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

缓存 构造器 循环 实例 属性 学习 内容 函数 原因 情况 步骤 还是 问题 成功 这样的话 不好 也就是 可以通过 就是 思路 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 计算机网络技术与应用中职书 阿里龙网络技术 srvlet连数据库报错 述评网络安全需要生态治理吗 散布谣言属于网络安全问题吗 ubuntu服务器测试带宽 飞常准数据库介绍 用友数据库及独占任务 怎样建立与数据库的连接java c 配置两个数据库连接 超融合网络安全产品有哪些 怎么提升自己的网络技术 腾讯云服务器cvm 网站上传文件到服务器指定目录 重庆黑白猫网络技术 中国工行软件开发中心珠海 软件开发保密协议通用 游戏引擎服务器端口要怎么打开 北京高科技互联网 金山区专业软件开发有哪些 教育机构会做软件开发吗 动车组网络技术课后答案 黎明杀机服务器怎么设置 最有前途的软件开发方向 网络安全认证产品 网络安全的五个重要元素 定期召开网络安全工作专题会 易班优课网络安全知识竞赛 软件开发工作室名称 网络安全宣传800字
0