亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring中的循環(huán)依賴詳解

 更新時間:2023年09月14日 08:47:52   作者:這堆干貨有點猛  
這篇文章主要介紹了Spring中的循環(huán)依賴詳解,  Spring 框架是一個流行的Java應用程序框架,它提供了許多強大的功能,如依賴注入和面向切面編程,然而在使用 Spring 框架時,我們可能會遇到循環(huán)依賴的問題,需要的朋友可以參考下

Spring 框架是一個流行的Java應用程序框架,它提供了許多強大的功能,如依賴注入和面向切面編程。然而在使用 Spring 框架時,我們可能會遇到循環(huán)依賴的問題。

這種情況發(fā)生在兩個或多個 Bean 之間相互依賴的情況下,其中一個 Bean 依賴于另一個 Bean,而另一個 Bean 又依賴于第一個 Bean。

在這種情況下,Spring 框架需要解決循環(huán)依賴的問題,否則應用程序可能會出現(xiàn)死鎖或其他錯誤。

本文將探討 Spring 框架是如何解決循環(huán)依賴的問題,以及它是如何工作的。我們將分析 Spring 框架的源代碼,并提供一些示例來說明 Spring 框架如何解決循環(huán)依賴的問題。

解決循環(huán)依賴的原理

在 Spring 框架中,當兩個或多個 Bean 之間相互依賴時, Spring 框架會創(chuàng)建一個代理對象,該代理對象負責管理這些 Bean 之間的依賴關系。這個代理對象被稱為“early proxy”或“exposed proxy”。

當一個 Bean 需要訪問另一個 Bean 時, Spring 框架會通過代理對象來獲取該 Bean。這個代理對象負責保證 Bean 的實例化順序,確保每個 Bean 都只被實例化一次,并且在所有依賴關系被滿足之前,不會暴露任何未實例化的 Bean 。

Spring 框架解決循環(huán)依賴的過程如下

  • 當 Spring 框架啟動時,它會掃描應用程序中的所有 Bean,并將它們注冊到一個 Bean Factory中。
  • 當一個 Bean 被實例化時Spring 框架會檢查它是否有任何依賴關系。
  • 如果 Bean 有依賴關系,則 Spring 框架會檢查這些依賴關系是否已經(jīng)被創(chuàng)建。
  • 如果依賴關系已經(jīng)被創(chuàng)建,則 Spring 框架會將依賴關系注入到 Bean 中,并返回該 Bean 的實例。
  • 如果依賴關系還沒有被創(chuàng)建,則 Spring 框架會創(chuàng)建一個代理對象(通過 getEarlyBeanReference 方法),并將該代理對象暴露給該 Bean。
  • 當依賴關系被創(chuàng)建時,Spring 框架會使用代理對象來獲取依賴關系,并將依賴關系注入到 Bean 中。
  • 當所有依賴關系都被滿足時,Spring 框架會返回該 Bean 的實例。

源碼解析

為了更好地理解 Spring 框架如何解決循環(huán)依賴的問題,我們將分析 Spring 框架的源代碼。

下面是一個簡單的示例,演示了 Spring 框架如何解決循環(huán)依賴的問題。

public class A {
    private B b;
    public A() {}
    public void setB(B b) {
        this.b = b;
    }
}
public class B {
    private A a;
    public B() {}
    public void setA(A a) {
        this.a = a;
    }
}
@Configuration
public class AppConfig {
    @Bean
    public A a() {
        return new A();
    }
    @Bean
    public B b() {
        return new B();
    }
}

在這個示例中,類A依賴于類B,而類B又依賴于類A。因此,這個示例展示了一個循環(huán)依賴的情況。

當應用程序啟動時,Spring 框架會掃描所有的 Bean ,并將它們注冊到一個BeanFactory中。

當 BeanFactory創(chuàng)建 Bean 時,它會檢查 Bean 是否有任何依賴關系。

在這個示例中,當 BeanFactory 創(chuàng)建 A 和 B 時,它會檢查它們之間的依賴關系。由于 A 依賴于 B,而 B 又依賴于 A,因此存在循環(huán)依賴的問題。

為了解決這個問題,Spring 框架會創(chuàng)建一個代理對象,該代理對象負責管理A和B之間的依賴關系。在這個示例中,當 BeanFactory 創(chuàng)建 A 時,它會創(chuàng)建一個代理對象,并將該代理對象暴露給A。當BeanFactory創(chuàng)建B時,它會創(chuàng)建一個代理對象,并將該代理對象暴露給 B。這樣,A和B就可以通過代理對象來訪問彼此,而不會出現(xiàn)循環(huán)依賴的問題。

下面是 Spring 框架解決循環(huán)依賴的源碼示例:

首先 Spring 框架會從緩存中獲取需要的 bean:

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
    Object singletonObject = this.singletonObjects.get(beanName);
    if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
        synchronized (this.singletonObjects) {
            singletonObject = this.earlySingletonObjects.get(beanName);
            if (singletonObject == null && allowEarlyReference) {
                ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                if (singletonFactory != null) {
                    singletonObject = singletonFactory.getObject();
                    this.earlySingletonObjects.put(beanName, singletonObject);
                    this.singletonFactories.remove(beanName);
                }
            }
        }
    }
    return (singletonObject != NULL_OBJECT ? singletonObject : null);
}

上面代碼中,框架分別從 singletonObjects、earlySingletonObjects、singletonFactories 中獲取需要的實例,如果獲取不到,就就行創(chuàng)建,在創(chuàng)建的過程中如果發(fā)現(xiàn)需要處理循環(huán)依賴,就會調(diào)用下面方法獲取代理對象:

private Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
    Object exposedObject = bean;
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
                SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
                exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
                if (exposedObject == null) {
                    return exposedObject;
                }
            }
        }
    }
    return exposedObject;
}

在這個示例中,getEarlyBeanReference() 方法是 Spring 框架用來獲取代理對象的方法。該方法首先檢查 Bean 是否為合成的 Bean ,然后檢查該 Bean 是否有任何實例化后的 Bean 后處理器。如果 Bean 有實例化后的 Bean 后處理器,則 Spring 框架會使用這些 Bean 后處理器來獲取代理對象。

spring.png

總結

在本文中,我們探討了 Spring 框架是如何解決循環(huán)依賴的問題的。

我們分析了 Spring 框架的源代碼,并提供了一些示例來說明 Spring 框架如何解決循環(huán)依賴的問題。

總之, Spring 框架通過創(chuàng)建代理對象來解決循環(huán)依賴的問題,該代理對象負責管理 Bean 之間的依賴關系,并確保每個 Bean 都只被實例化一次。

到此這篇關于Spring中的循環(huán)依賴詳解的文章就介紹到這了,更多相關Spring循環(huán)依賴內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java與js代碼互調(diào)示例代碼

    java與js代碼互調(diào)示例代碼

    用到java和js方法互調(diào),在用HTML5做跨平臺應用開發(fā)時經(jīng)常會用到,在這里分享一些自己在實際開發(fā)過程中的用法,希望對初學者有所幫助
    2013-07-07
  • springboot 整合 seata的配置過程

    springboot 整合 seata的配置過程

    本文給大家介紹springboot 整合 seata的配置過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-08-08
  • 一篇文章帶你深入了解javaIO基礎

    一篇文章帶你深入了解javaIO基礎

    這篇文章主要介紹了java 基礎知識之IO總結的相關資料,Java中的I/O分為兩種類型,一種是順序讀取,一種是隨機讀取,需要的朋友可以參考下,希望對你有幫助
    2021-08-08
  • futuretask用法及使用場景介紹

    futuretask用法及使用場景介紹

    這篇文章主要介紹了futuretask用法及使用場景介紹,小編覺得挺不錯的,這里分享給大家,供大家參考。
    2017-10-10
  • SpringMVC互聯(lián)網(wǎng)軟件架構REST使用詳解

    SpringMVC互聯(lián)網(wǎng)軟件架構REST使用詳解

    這篇文章主要為大家詳細介紹了SpringMVC互聯(lián)網(wǎng)軟件架構REST的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Java的@Transactional、@Aysnc、事務同步問題詳解

    Java的@Transactional、@Aysnc、事務同步問題詳解

    這篇文章主要介紹了Java的@Transactional、@Aysnc、事務同步問題詳解,現(xiàn)在我們需要在一個業(yè)務方法中插入一個用戶,這個業(yè)務方法我們需要加上事務,然后插入用戶后,我們要異步的方式打印出數(shù)據(jù)庫中所有存在的用戶,需要的朋友可以參考下
    2023-11-11
  • Java方法重寫_動力節(jié)點Java學院整理

    Java方法重寫_動力節(jié)點Java學院整理

    在Java和其他一些高級面向?qū)ο蟮木幊陶Z言中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類并不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。方法重寫又稱方法覆蓋,下文給大家介紹java方法重寫及重寫規(guī)則,一起學習吧
    2017-04-04
  • 詳細圖解Java中字符串的初始化

    詳細圖解Java中字符串的初始化

    字符串廣泛應用在Java編程中,在Java中字符串屬于對象,Java提供了String類來創(chuàng)建和操作字符串,下面這篇文章主要給大家介紹了Java中字符串初始化的相關資料,需要的朋友可以參考下
    2021-08-08
  • 利用Spring JPA中的@Version注解實現(xiàn)樂觀鎖

    利用Spring JPA中的@Version注解實現(xiàn)樂觀鎖

    樂觀鎖是數(shù)據(jù)庫和應用程序中使用的一種并發(fā)控制策略,用于在多個事務嘗試更新單個記錄時確保數(shù)據(jù)完整性,Java Persistence API (JPA) 提供了一種借助@Version注解在 Java 應用程序中實現(xiàn)樂觀鎖的機制,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2023-11-11
  • MyBatis 接收數(shù)據(jù)庫中沒有的字段的解決

    MyBatis 接收數(shù)據(jù)庫中沒有的字段的解決

    這篇文章主要介紹了MyBatis 接收數(shù)據(jù)庫中沒有的字段的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論