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

一篇帶給你 Spring 循環依賴詳解

開發 架構
使用三級緩存的目的是為了提前暴露對象、避免重復創建對象以及支持復雜的循環依賴鏈的解決。通過三級緩存,Spring 能夠更有效地管理和解決循環依賴的問題,確保對象的正確創建和依賴注入。

Spring 循環依賴解決辦法及使用案例

在 Spring 中,循環依賴指的是兩個或多個 Bean 之間相互依賴,形成了一個循環引用的關系。這種情況下,Spring 容器無法完成正確的依賴注入,可能導致應用程序無法啟動或出現錯誤。

下面是一種循環依賴的示例及解決辦法:

示例: 假設有兩個類 A 和 B,它們相互依賴。

public class A {
    private B b;

    public A(B b) {
        this.b = b;
    }
}

public class B {
    private A a;

    public B(A a) {
        this.a = a;
    }
}

在上述示例中,類 A 依賴于類 B,而類 B 依賴于類 A,形成了循環依賴。

解決辦法:

構造函數注入改為 Setter 注入:將循環依賴的類的構造函數注入方式改為 Setter 注入。這樣,在創建 Bean 實例后,先設置依賴的 Bean,再通過 Setter 方法注入依賴。

public class A {
    private B b;

    public void setB(B b) {
        this.b = b;
    }
}

public class B {
    private A a;

    public void setA(A a) {
        this.a = a;
    }
}

使用 @Lazy 注解:在循環依賴的其中一個類上使用 @Lazy 注解。這樣,在初始化 Bean 時,Spring 會創建一個代理對象來解決循環依賴。

@Component
public class A {
    private B b;

    public A(@Lazy B b) {
        this.b = b;
    }
}

@Component
public class B {
    private A a;

    public B(A a) {
        this.a = a;
    }
}

在上述示例中,類 A 使用了 @Lazy 注解,告訴 Spring 在初始化時暫時不解決依賴,而是創建一個代理對象。這樣,當類 B 注入 A 時,實際上會注入 A 的代理對象,從而解決循環依賴。

請注意,循環依賴是一種設計上的問題,應盡量避免出現。在實際開發中,應優化類之間的依賴關系,減少循環引用的發生。如果確實遇到循環依賴,可以考慮上述解決辦法來解決問題。

Spring 是如何解決循環依賴的呢

Spring 使用了三級緩存來解決循環依賴的問題。下面是 Spring 解決循環依賴的基本過程:

  • 創建對象:當 Spring 容器創建一個 Bean 時,會先創建一個空的對象實例,并將其放入一級緩存中。
  • 注入屬性:Spring 會為該對象注入依賴的屬性。如果發現有循環依賴,Spring 會將當前對象提前暴露給容器,但屬性值仍然是空的。
  • 提前暴露對象:Spring 將未完成依賴注入的對象放入二級緩存中,以便后續使用。
  • 注入剩余屬性:Spring 繼續為對象注入剩余的屬性。如果發現依賴的屬性需要循環依賴的對象,Spring 會從二級緩存中獲取暴露的對象,完成依賴注入。
  • 完成對象創建:當所有依賴注入完成后,Spring 將對象放入三級緩存中,并執行初始化操作。
  • 解決循環依賴:當其他 Bean 需要循環依賴的對象時,Spring 會從三級緩存中獲取已創建的對象,而不是再次創建新的對象。

通過使用三級緩存,Spring 實現了在循環依賴情況下的對象創建和依賴注入。它通過提前暴露半成品對象,并從緩存中獲取已創建的對象來解決循環依賴的問題。

需要注意的是,Spring 的循環依賴解決僅適用于單例作用域的 Bean,默認情況下,原型作用域的 Bean 不會解決循環依賴。如果出現原型作用域的循環依賴,Spring 會拋出異常并拒絕創建。

Spring 為何要三級緩存 二級緩存已經可以解決循環依賴了啊

對于 Spring 解決循環依賴的過程中,為什么需要三級緩存而不僅僅使用二級緩存的問題,可以從以下幾個方面來解釋:

  • 提前暴露對象:當發現循環依賴時,Spring 需要將當前對象提前暴露給容器,以滿足其他 Bean 對它的依賴。二級緩存中的對象仍然處于未完成狀態,無法滿足其他 Bean 的依賴關系。通過在一級緩存中創建對象實例,提前暴露對象,可以解決這個問題。
  • 避免重復創建對象:二級緩存只能存儲未完成的對象實例,而無法存儲已經完成依賴注入的對象。如果只使用二級緩存,在依賴注入過程中,每次都需要重新創建對象實例,增加了重復工作的開銷。而通過三級緩存,已經完成依賴注入的對象可以被緩存起來,以供后續使用,避免了重復創建對象的操作。
  • 支持循環依賴鏈的解決:在復雜的應用中,可能存在多個 Bean 之間形成的循環依賴鏈。二級緩存只能存儲當前對象及其直接依賴,無法處理鏈式依賴關系。而通過三級緩存,可以將整個循環依賴鏈中的對象都緩存起來,并在需要時進行獲取和注入。

綜上所述,使用三級緩存的目的是為了提前暴露對象、避免重復創建對象以及支持復雜的循環依賴鏈的解決。通過三級緩存,Spring 能夠更有效地管理和解決循環依賴的問題,確保對象的正確創建和依賴注入。

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-04-14 14:16:58

HttpHttp協議網絡協議

2022-04-29 14:38:49

class文件結構分析

2022-03-03 09:05:17

索引MySQL數據查詢

2023-03-09 07:47:56

BeanFactorSpring框架

2021-03-28 09:12:58

多線程死鎖技術熱點

2021-08-06 17:47:46

Kotin高階函數函數

2020-12-24 08:07:18

SpringBootSpring SecuWeb

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2021-06-07 12:06:19

SpringCloud Sleuth微服務

2021-06-21 14:36:46

Vite 前端工程化工具

2021-01-28 08:55:48

Elasticsear數據庫數據存儲

2023-03-29 07:45:58

VS編輯區編程工具

2021-04-08 11:00:56

CountDownLaJava進階開發

2021-07-21 09:48:20

etcd-wal模塊解析數據庫

2024-06-13 08:34:48

2022-03-22 09:09:17

HookReact前端

2021-04-01 10:51:55

MySQL鎖機制數據庫

2021-03-12 09:21:31

MySQL數據庫邏輯架構

2022-02-17 08:53:38

ElasticSea集群部署

2022-02-25 15:50:05

OpenHarmonToggle組件鴻蒙
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 伊人色综合久久天天五月婷 | 精品国产1区2区3区 一区二区手机在线 | 国产在线小视频 | 中文字幕一区二区三区精彩视频 | 色在线免费 | 天堂在线一区 | 91精品国产综合久久香蕉麻豆 | 日韩av成人| 国产欧美日韩久久久 | 日本高清不卡视频 | 一区二区三区四区在线免费观看 | 麻豆精品国产91久久久久久 | 欧美日韩国产在线观看 | 国产亚洲一区二区三区在线 | 91精品国产综合久久国产大片 | 日本三级在线视频 | 国产精品久久久久久久久久免费看 | 91在线导航 | 伊人一区 | 欧美男男videos | 国产一区欧美 | 成人精品国产 | 日本在线视频一区二区 | 激情一区二区三区 | 亚洲精品字幕 | 国产精品欧美精品日韩精品 | 日韩精品一区二区三区在线播放 | 成人性生交大片免费看中文带字幕 | 国产在线精品一区二区 | 欧美一级高清片 | www.4567| 久久99这里只有精品 | 欧美xxxx黑人又粗又长 | 北条麻妃av一区二区三区 | 最新中文字幕一区 | 在线视频一区二区三区 | 免费欧美视频 | 精品国产欧美日韩不卡在线观看 | 国产在线观 | 久久久久久国产精品免费免费狐狸 | 91精品一区二区三区久久久久 |