Spring 如何解决循环依赖?Spring三级缓存

什么是循环依赖

说白是一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用。

自己依赖自己

两个对象间的依赖关系

多个对象间的依赖关系

Spring出现循环依赖的场景

单例的setter注入

@Service
public class A {@Resourceprivate B b;public void test1(){}
}
@Service
public class B {@Resourceprivate A a;public void test2(){}}

这是一个典型的循环依赖问题,但是Spring已经帮我们解决了,所以我们无法察觉到问题

 

Spring内部有三级缓存:

一级缓存:singletonObjects,用于保存实例化、初始化完成的bean

一级缓存作用:限制bean在beanFactory中只存一份,即实现singleton scope,解决不了循环依赖 

 如果要想打破循环依赖, 就需要一个中间人的参与, 这个中间人就是二级缓存。

 

二级缓存:earlySingletonObjects,用于保存实例化完成的bean实例

三级缓存:singletonObjects,用于保存bean的创建工厂,以便于后面有机会创建代理对象 

Spring三级缓存间的关系

 

构造方法出现了循环依赖怎么解决?

原因:由于bean的生命周期中构造函数是第一个执行的,spring框架并不能解决构造函数的的依赖注入

可以通过@Lazy注解解决,什么时候需要对象再进行bean对象的创建

public A(@Lazy B b){    

     System.out.println("A的构造方法执行了...");    

     this.b = b ;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/468491.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深刻反思现代化进程:20世纪与21世纪的比较分析及东西方思想家的贡献

深刻反思现代化进程:20世纪与21世纪的比较分析及东西方思想家的贡献 摘要:随着人类社会的快速发展,现代化已成为全球范围内的普遍追求。然而,20世纪至21世纪的现代化进程并非一帆风顺,它伴随着环境破坏、社会不平等和文…

Ubuntu 23.10通过APT安装Open vSwitch

正文共:888 字 8 图,预估阅读时间:1 分钟 先拜年!祝各位龙年行大运,腾跃展宏图! 之前在介绍OpenStack的时候介绍过(什么是OpenStack?),OpenStack是一个开源的…

【DDD】学习笔记-订单核心流程的事件风暴

现在,我们针对电商领域的订单核心流程开展事件风暴工作坊,以此来获得我们的领域分析模型。 工作坊准备 要开展好事件风暴工作坊,需得具备天时地利人和。 天时地利人和 天时。需得安排好专门的时间来一个为期多天的事件风暴。事件风暴很难…

Ambiguous Medical Image Segmentation using Diffusion Models利用扩散模型分割模糊医学图像

摘要: 事实证明,在临床任务中,来自一组专家的集体见解总是优于个人的最佳诊断。对于医学图像分割任务,现有的基于人工智能的替代研究更多地侧重于开发能够模仿最佳个体的模型,而不是利用专家组的力量。 在本文中&…

问卷传播全攻略:如何高效扩散你的调查问卷?

随着互联网的兴起,调查问卷也逐渐地从线下转向线上。我们自己在使用问卷调查工具的时候,怎么在线上平台进行传播分享来收集问卷呢?针对这个问题,Zoho Survey可以解答。问卷制作完成后,在Survey中可以和自动生成链接或者…

基于决策树的金融市场波动性预测与应用

基于决策树的金融市场波动性预测与应用 项目背景与意义数据概述与分析数据来源数据特征 数据预处理与特征工程模型训练与评估结果与应用总结 LightGBM是一个机器学习算法库,用于梯度提升机(Gradient Boosting Machine)的实现。梯度提升机是一…

LabVIEW伺服阀动静态测试系统

LabVIEW伺服阀动静态测试系统 基于LabVIEW开发了一套伺服阀动静态测试系统,提高伺服阀在电液伺服控制系统中的性能测试精度和效率。通过设计合理的液压系统、电控系统及软件系统,实现了伺服阀的动态和静态特性测试,采用流量-压力双闭环稳态控…

17 外排序

排序分为内排序和外排序,内排序是在内存中的排序。外排序指在磁盘中文件的排序,因为在磁盘中,不能进行下标访问,归并排序经常用于磁盘中文件的排序 假如有10亿个整形数据在磁盘中,要对它排序,内存中只有1G…

海量数据处理商用短链接生成器平台 - 4

第六章 架构核心技术-池化思想-异步结合 性能优化最佳实践 第1集 RestTemplate里面的存在的问题你知道多少- Broken pipe错误 项目就更新到第六章了,剩下的内容 放百度网盘里面了,需要的来取。 链接:https://pan.baidu.com/s/19LHPw36dsxPB7…

Java安全 CC链6分析

CC链6分析 前言CC链分析核心transform链Lazymap类TiedMapEntry类HashMap方法 最终exp 前言 CC链6不受jdk版本与cs版本的影响,在Java安全中最为通用,并且非常简洁,非常有学习的必要,建议在学习CC链6之前先学习一下 URLDNS链 和 CC…

Unity类银河恶魔城学习记录7-4 P70 Improving sword‘s behaviour源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill_Controller.cs using System.Collections; using System.Colle…

请求https网站报错

最近在做爬虫项目时遇到的一个报错,说是SSL证书验证失败。 开始还以为是代理又出了问题,后来经过查阅各种资料了解到这是因为Python2.7.9之后的版本在调用urllib.urlopen时会先验证一下https网站的SSL证书,而目标网站使用的是自签名的证书&am…