Spring中如何解决循环依赖

news/发布时间2024/5/17 17:09:44

八字真言:“三级缓存,提前暴露”

此文只是介绍简单的情况便于理解,实际上场景会更复杂、情况会更多,但是原理相通。

一、什么是循环依赖?

从字面上来理解就是A依赖B的同时B也依赖了A,就像下面这样
 
0
上图是简单的循环依赖,也会存在A依赖B,B依赖C,C依赖A这种循环,或者更复杂的情况。
(在实际工作中应该尽量避免出现循环依赖的情况)

二、什么情况下循环依赖可以被处理?

0

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

三级缓存:

一级缓存 : Map<string,object> singletonObjects,单例池,用于保存实例化、属性赋值(注入)、初始化完成的 bean 实例
二级缓存 : Map<string,object> earlySingletonObjects,早期曝光对象,用于保存实例化完成的 bean 实例
三级缓存 : Map<string,objectfactory<?>> singletonFactories,早期曝光对象工厂,用于保存 bean 创建工厂,以便于后面扩展有机会创建代理对象。

流程图:

0

总结:

假如testService1依赖testService2,testService2依赖testService1
Bean初始化流程:
  1. 创建 testService1实例,实例化的时候把 testService1 对象⼯⼚放⼊三级缓存,并提前先暴露出来;
  2. testService1 注⼊属性时,发现依赖 testService2,此时 testService2 还没有被创建出来,所以去实例化 testService2;
  3. 同样,testService2注⼊属性时发现依赖 testService1,它就会从缓存里找 testService1对象。依次从⼀级到三级缓存查询 testService1,从三级缓存通过对象⼯⼚拿到 testService1,发现 testService1虽然不太完善,但是存在,把 testService1 放⼊⼆级缓存,同时删除三级缓存中的 testService1,此时,testService2 已经实例化并且初始化完成,把testService2放入⼀级缓存
  4. 接着testService1继续属性赋值,顺利从⼀级缓存拿到实例化且初始化完成的testService2对象,testService1对象创建也完成,删除⼆级缓存中的 testService1,同时把testService1放⼊⼀级缓存
  5. 最后,⼀级缓存中保存着实例化、初始化都完成的 testService1、testService2 对象

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

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

相关文章

Postgresql同步数据到Elasticsearch

Postgresql同步数据到es需要借助中间工具连接器,连接器部署主要有两种方式,一种是基于Elastic云托管的连接器(Native connectors), 另外一种自己安装管理的连接器(self-managed connector). 托管方式连接器的使用方法文档:https://www.elastic.co/guide/en/enterprise-sear…

2024年3月30号java学习

集合集合中的长度不固定,集合中只能存储引用数据类型,不能够存放基本数据类型,需要变成基本数据类型对应的包装类。 基本数据类型的包装类ArrayList ArrayList<类型> 变量名 = new ArrayList<>();示例代码 package arrayList;import java.util.ArrayList;public …

ESP8266使用笔记

ESP8266介绍上图所示的是ESP-01s,我目前使用的是由安信可科技公司开发的模块,搭有板载天线。可以由AP/STA/AP+STA三种工作模式。其中AP工作模式是作为WIFI的客户端存在,其他设备主动链接在AP设备上,可以接收AP设备发送的消息,也可以反过来给AP设备发送消息。 STA工作模式则…

JavaImprove--Lesson07--异常处理的两种方式,collection集合

一.Java异常处理的两种方式 Java的异常机制是一种处理程序中错误的方式,它包括异常的抛出、捕获和处理。异常是在程序运行过程中发生的异常事件,如数学运算中的除0异常、数组越界、空指针异常等。 在Java中,异常被视为一种对象,可以通过使用try-catch语句块来捕获和处理。当…

DreamerV2

DreamerV2 DreamerV2是一个用于强化学习的算法,专注于从像素输入中学习复杂的行为。它是Dreamer算法的升级版本,由DeepMind的研究团队开发。DreamerV2利用世界模型的概念,这意味着它通过学习一个模型来预测环境的未来状态,从而在这个预测的世界里进行计划和决策。这种方法使…

莫队算法学习笔记

Part.1 引入 当你遇到一个区间询问但是难以用线段树等 log 算法维护的时候怎么办?那就是——莫队! 莫队这个东西能支持区间修改、区间查询的操作,但是这种算法要求离线。莫队有很多种,详细请看下文。 Part.2 普通莫队 我们先来看一道例题(P1972 的削弱版):给你一个长度为…