成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring循環依賴詳解(看這篇就夠了)

開發 前端
一級緩存(singletonObjects)也被稱為單例池,去存放已經創建完成,并且屬性也注入完畢的對象,一般情況我們獲取bean都是從這里獲取的。

循環依賴

在探討Spring循環依賴的解決方式以前,我們先來回憶一下什么是循環依賴。

循環依賴:就是多個bean之間相互依賴,形成了一個閉環。

比如:A依賴于B、B依賴于A,如下圖所示:

圖片圖片

體現到代碼中為:

@Component
public class A{
   // 依賴B
   @Autowired
   private B b;
   public B getB() {
      return b;
   }
}


@Component
public class B {
   // 依賴A
   @Autowired
   private A a;
   public A getA() {
      return a;
   }
}

Spring的循環依賴過程:

  • 首先實例化A -> 屬性填充注入B -> B還沒有實例化;
  • 需要先進行實例化B(A等待) -> 實例化B -> 注入A -> A實例化未完成,無法注入 -> 實例化B失敗 -> 實例化A失敗;

這樣反復就進入了死循環了。

Spring如何解決循環依賴

下面我還是用A -> B -> A的場景,我們按照過程一步步來分析,看一下Spring是如何解決循環依賴的。

第一步:首先是實例化A

圖片圖片

第二步:屬性注入B

執行到屬性填充環節需要注入B,因為Spring管理的bean默認是單例的,為防止重復創建Spring會先去容器中查找B,如果查找不到再進行創建。

如果Spring容器中是沒有B,需要先實例化B,流程和實例化一致,如下圖所示:

圖片圖片

第三步:屬性注入A

此時B也執行到屬性填充的環節了,此時又需要注入A,此時還是會先去Spring容器中查找A,此時的A雖然沒在單例池中,但是因為在創建中并且也在三級緩存中了。

所以此時獲取A的流程就發生了變化,不再是直接創建,而是會從三級緩存中獲取A,如下圖所示:

圖片圖片

三級緩存存放的并不是bean對象,而是生成bean的ObjectFactory,然后放入二級緩存中,同時返回A進行依賴注入。

第四步:初始化B

此時,繼續執行B的實例化, 并將B從正在創建列表移出 , 將B放入一級緩存,同時將B在二級緩存和三級緩存中刪,最后返回B。

圖片圖片

在B實例化完成并返回后,A的實例化流程也從等待著蘇醒繼續執行,后續流程和B的完全一致。

圖片圖片

然后整個流程:A -> B -> A的場景就結束了。

這樣Spring通過三級緩存來解決循環依賴的,提前暴露的對象存放在三級緩存中,二級緩存存放過渡bean,一級緩存存放最終形態的bean。

Spring三級緩存

// 從上至下 分表代表這“三級緩存”
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); //一級緩存
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16); // 二級緩存
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16); // 三級緩存

1.三級緩存(singletonFactories)

singletonFactories:單例對象工廠的cache,存放 bean 工廠對象,用于解決循環依賴。

2.二級緩存(earlySingletonObjects)

主要存放過渡bean,也就是三級緩存中ObjectFactory產生的對象。

提前曝光的單例對象的cache,存放原始的 bean 對象:尚未填充屬性,用于解決循環依賴。

3.一級緩存(singletonObjects)

也被稱為單例池,去存放已經創建完成,并且屬性也注入完畢的對象,一般情況我們獲取bean都是從這里獲取的。

責任編輯:武曉燕 來源: mikechen的互聯網架構
相關推薦

2021-12-13 10:43:45

HashMapJava集合容器

2021-09-30 07:59:06

zookeeper一致性算法CAP

2019-08-16 09:41:56

UDP協議TCP

2023-11-03 08:53:15

StrconvGolang

2021-05-07 07:52:51

Java并發編程

2022-03-29 08:23:56

項目數據SIEM

2022-10-17 09:01:09

JavaScripNode.js

2021-07-12 12:20:08

Spring初始化方案

2025-02-18 16:00:00

SpringBoot支付Java

2017-03-30 22:41:55

虛擬化操作系統軟件

2023-09-25 08:32:03

Redis數據結構

2021-09-10 13:06:45

HDFS底層Hadoop

2023-10-04 00:32:01

數據結構Redis

2021-07-28 13:29:57

大數據PandasCSV

2023-11-07 07:46:02

GatewayKubernetes

2021-10-21 06:52:17

ZooKeeper分布式配置

2023-12-07 09:07:58

2018-09-26 11:02:46

微服務架構組件

2021-04-11 08:30:40

VRAR虛擬現實技術

2022-08-18 20:45:30

HTTP協議數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99精品国产一区二区三区 | 国产精品 亚洲一区 | 中文字幕在线视频免费观看 | 国产一区二区美女 | 国产在线视频一区二区 | 91精品久久久久久久久 | www网站在线观看 | 自拍偷拍中文字幕 | 欧美一二三 | 亚洲乱码国产乱码精品精98午夜 | 亚洲视频免费观看 | 91精品久久久久久久久中文字幕 | 一区二区国产精品 | 日韩精品视频中文字幕 | 欧美日韩在线一区二区 | 日本三级全黄三级三级三级口周 | 日韩精品成人免费观看视频 | 国产一区二区三区在线 | 国产精品久久久久久久久久久新郎 | 久久国产欧美日韩精品 | 狠狠色狠狠色综合日日92 | 精品国产免费人成在线观看 | www.欧美视频 | 久久久不卡网国产精品一区 | 欧洲视频一区 | 色就是色欧美 | 亚洲高清av在线 | 久久91精品 | 亚洲成人一区 | 久久免费观看一级毛片 | 91精品国产综合久久久久蜜臀 | а天堂中文最新一区二区三区 | 国产精品999| www.99热.com| 日韩精品在线视频 | 久久久久久久久久久久久久久久久久久久 | 狠狠干av| 干出白浆视频 | 99国产视频 | 亚洲品质自拍视频 | 亚洲精品乱码久久久久久蜜桃 |