91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是Spring的循環依賴

發布時間:2020-07-27 14:29:39 來源:億速云 閱讀:673 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關什么是Spring的循環依賴,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

1、解釋一下循環依賴的定義。

循環依賴其實是指兩個及以上bean相互持有對方,最終形成閉環的過程,一般聊循環依賴都是默認的單例bean。直白一點解釋就是A依賴BB依賴CC又依賴AABC三者形成了一個閉環,這就是循環依賴。

2、在Spring中有哪些循環依賴的場景?

1)構造器的循環依賴

這一種循環依賴的場景是沒辦法解決的。

 

@Service

public class A { 

    public A(B b) {  }

}

 

@Service

public class B { 

    public B(C c) { 

    }

}

 

@Service

public class C { 

    public C(A a) {  }

}

2setter的依賴注入

這種循環依賴的場景可以使用提前暴露對象的方式進行解決。

<bean id="exampleBean" class="examples.ExampleBean">

    <!-- setter injection using the nested ref element -->

    <property name="beanOne">

        <ref bean="anotherExampleBean"/>

    </property>

 

    <!-- setter injection using the neater ref attribute -->

    <property name="beanTwo" ref="yetAnotherBean"/>

    <property name="integerProperty" value="1"/>

</bean>

 

<bean id="anotherExampleBean" class="examples.AnotherBean"/>

<bean id="yetAnotherBean" class="examples.YetAnotherBean"/>  

 

 

public class ExampleBean {

 

    private AnotherBean beanOne;

 

    private YetAnotherBean beanTwo;

 

    private int i;

 

    public void setBeanOne(AnotherBean beanOne) {

        this.beanOne = beanOne;

    }

 

    public void setBeanTwo(YetAnotherBean beanTwo) {

        this.beanTwo = beanTwo;

    }

 

    public void setIntegerProperty(int i) {

        this.i = i;

    }

}

3、描述一下SpringBean的生命周期。

1Spring啟動,查找并加載需要被Spring管理的bean,進行Bean的實例化。

2Bean實例化后對將Bean的引入和值注入到Bean的屬性中。

3)如果Bean實現了BeanNameAware接口的話,SpringBeanId傳遞給setBeanName()方法。

4)如果Bean實現了BeanFactoryAware接口的話,Spring將調用setBeanFactory()方法,將BeanFactory容器實例傳入。

5)如果Bean實現了ApplicationContextAware接口的話,Spring將調用BeansetApplicationContext()方法,將bean所在應用上下文引用傳入進來。

6)如果Bean實現了BeanPostProcessor接口,Spring就將調用他們的postProcessBeforeInitialization()方法。

7)如果Bean 實現了InitializingBean接口,Spring將調用他們的afterPropertiesSet()方法。類似的,如果bean使用init-method聲明了初始化方法,該方法也會被調用

8)如果Bean 實現了BeanPostProcessor接口,Spring就將調用他們的postProcessAfterInitialization()方法。

9)此時,Bean已經準備就緒,可以被應用程序使用了。他們將一直駐留在應用上下文中,直到應用上下文被銷毀。

10)如果bean實現了DisposableBean接口,Spring將調用它的destory()接口方法,同樣,如果bean使用了destory-method 聲明銷毀方法,該方法也會被調用。

4、什么是三級緩存?

1)第一級緩存:單例緩存池singletonObjects

2)第二級緩存:早期提前暴露的對象緩存earlySingletonObjects

3)第三級緩存:singletonFactories單例對象工廠緩存。

5、三級緩存和二級緩存的區別?

二級緩存只需要存儲beanName和提前暴露的bean的實例的映射關系即可;三級緩存不僅需要提前暴露的bean進行返回,還要對該beanBeanPostProcessor后置處理;三級緩存將暴露的bean處理完之后,將暴露的bean轉移到二級緩存,同時刪除三級緩存的數據;三級緩存才是解決循環依賴的根本。

6Spring是如何通過三級緩存來解決問題的?

對于單例對象來說,在Spring的整個容器的生命周期內,有且只存在一個對象,很容易想到這個對象應該存在Cache中,Spring大量運用了Cache的手段,在循環依賴問題的解決過程中甚至使用了&ldquo;三級緩存&rdquo;。singletonObjects指單例對象的cachesingletonFactories指單例對象工廠的cacheearlySingletonObjects指提前曝光的單例對象的cache。以上三個cache構成了三級緩存,Spring就用這三級緩存巧妙的解決了循環依賴問題。

以上就是什么是Spring的循環依賴,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绍兴县| 怀宁县| 泰和县| 临潭县| 洛宁县| 涟源市| 汝城县| 慈溪市| 玉田县| 定安县| 洪雅县| 兰溪市| 塘沽区| 越西县| 宁晋县| 宜都市| 浙江省| 全南县| 汶川县| 砚山县| 金沙县| 榕江县| 沾益县| 安乡县| 桂阳县| 广丰县| 西城区| 达日县| 雅江县| 巩义市| 安国市| 仁化县| 禹城市| 交口县| 宁南县| 南投市| 杭州市| 大余县| 鄂州市| 习水县| 元谋县|