最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring輕松解決循環(huán)依賴

 更新時間:2023年04月20日 09:19:56   作者:這堆干貨有點猛  
Spring的解決循環(huán)依賴是有前置條件的,要解決循環(huán)依賴我們首先要了解Spring Bean對象的創(chuàng)建過程和依賴注入的方式。依賴注入方式,我之前的博客有所分享,大家可以在看本篇文章之前進行一下小小的回顧

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

這種情況發(fā)生在兩個或多個 Bean 之間相互依賴的情況下,其中一個 Bean 依賴于另一個 Bean,而另一個 Bean 又依賴于第一個 Bean。在這種情況下,Spring 框架需要解決循環(huán)依賴的問題,否則應(yīng)用程序可能會出現(xiàn)死鎖或其他錯誤。

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

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

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

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

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

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

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

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

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

為了解決這個問題,Spring 框架會創(chuàng)建一個代理對象,該代理對象負責管理A和B之間的依賴關(guān)系。在這個示例中,當 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 后處理器來獲取代理對象。

總結(jié)

在本文中,我們探討了 Spring 框架是如何解決循環(huán)依賴的問題的。我們分析了 Spring 框架的源代碼,并提供了一些示例來說明 Spring 框架如何解決循環(huán)依賴的問題??傊?, Spring 框架通過創(chuàng)建代理對象來解決循環(huán)依賴的問題,該代理對象負責管理 Bean 之間的依賴關(guān)系,并確保每個 Bean 都只被實例化一次。

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

相關(guān)文章

  • java網(wǎng)上圖書商城(1)User模塊

    java網(wǎng)上圖書商城(1)User模塊

    這篇文章主要介紹了java網(wǎng)上圖書商城,User模塊,實現(xiàn)用戶注冊功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Java中關(guān)于Collections集合工具類的詳細介紹

    Java中關(guān)于Collections集合工具類的詳細介紹

    Java提供了一個操作Set、List和Map等集合的工具類:Collections,該工具提供了大量方法對集合元素進行排序、查詢和修改等操作,還提供了將集合對象設(shè)置為不可變、對集合對象實現(xiàn)同步控制等方法
    2021-09-09
  • Jmeter參數(shù)化實現(xiàn)方法及應(yīng)用實例

    Jmeter參數(shù)化實現(xiàn)方法及應(yīng)用實例

    這篇文章主要介紹了Jmeter參數(shù)化實現(xiàn)方法及應(yīng)用實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Java基礎(chǔ)知識之StringReader流的使用

    Java基礎(chǔ)知識之StringReader流的使用

    這篇文章主要介紹了Java基礎(chǔ)知識之StringReader流的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 解析Spring中@Controller@Service等線程安全問題

    解析Spring中@Controller@Service等線程安全問題

    這篇文章主要為大家介紹解析了Spring中@Controller@Service等線程的安全問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • Java中ArrayList的使用詳細介紹

    Java中ArrayList的使用詳細介紹

    這篇文章主要介紹了Java中ArrayList的使用,本文給大家詳細講述該相關(guān)的知識點,并且會通過大量的案例加以說明,需要的朋友可以參考一下
    2022-04-04
  • JAVA項目常用異常處理匯總

    JAVA項目常用異常處理匯總

    這篇文章主要介紹了JAVA項目常用異常處理匯總,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Java基礎(chǔ)知識之I/O流和File類文件操作

    Java基礎(chǔ)知識之I/O流和File類文件操作

    眾所周知java語言提供給程序員非常多的包供編程時使用,方便又快捷,下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)知識之I/O流和File類文件操作的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • 講解ssm框架整合(最通俗易懂)

    講解ssm框架整合(最通俗易懂)

    這篇文章主要介紹了講解ssm框架整合(最通俗易懂),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • 基于IOC容器實現(xiàn)管理mybatis過程解析

    基于IOC容器實現(xiàn)管理mybatis過程解析

    這篇文章主要介紹了基于IOC容器實現(xiàn)管理mybatis過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07

最新評論

芜湖县| 平山县| 漯河市| 巴楚县| 二手房| 迁西县| 辽宁省| 邓州市| 庆元县| 东港市| 屯留县| 墨玉县| 松原市| 黄龙县| 舒兰市| 图木舒克市| 呼图壁县| 康马县| 阳东县| 习水县| 湘乡市| 宜都市| 卓尼县| 民县| 广饶县| 本溪| 南安市| 澄城县| 高要市| 泰和县| 永平县| 确山县| 延吉市| 宜州市| 江山市| 彭阳县| 新宁县| 杭锦后旗| 宜丰县| 清远市| 邛崃市|