中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

spring之Bean的循環依賴問題-創新互聯

文章目錄
  • 一、Bean的循環依賴之Set注入模式下
    • 1、Husband類
    • 2、Wife類
    • 3、Spring配置文件
    • 4、測試類
    • 5、測試結果
    • 6、結論
  • 二、Bean的循環依賴之構造方法注入模式下
    • 1、Husband類
    • 2、Wife類
    • 3、Spring配置文件
    • 4、測試類
    • 5、運行結果
  • 三、Spring解決循環依賴的機理
    • 三級緩存(面試常問)

十余年的奇臺網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。營銷型網站的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整奇臺建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。創新互聯公司從事“奇臺網站設計”,“奇臺網站推廣”以來,每個客戶項目都認真落實執行。
一、Bean的循環依賴之Set注入模式下

A對象中有B屬性,B對象中有A屬性。這就是循環依賴。我依賴你,你也依賴我。
比如:丈夫類Husband、妻子類Wife。Husband類中有Wife類的引用。Wife類中有Husband類的引用。

1、Husband類

husband類中有wife

注意:里邊的toString方法對于wife這個屬性使用了getName()避免陷入死循環

public class Husband {private String name;
    private Wife wife;

    public void setName(String name) {this.name = name;
    }

    public void setWife(Wife wife) {this.wife = wife;
    }

    public String getName() {return name;
    }

    @Override
    public String toString() {return "Husband{" +
                "name='" + name + '\'' +
                ", wife=" + wife.getName() +
                '}';
    }
}
2、Wife類

wife類中有husband

public class Wife {private String name;
    private Husband husband;

    @Override
    public String toString() {return "Wife{" +
                "name='" + name + '\'' +
                ", husband=" + husband.getName() +
                '}';
    }

    public String getName() {return name;
    }

    public void setName(String name) {this.name = name;
    }

    public void setHusband(Husband husband) {this.husband = husband;
    }
}
3、Spring配置文件

配置兩個bean

4、測試類
@Test
    public void testDeprndency(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring2.xml");
        Husband husband = applicationContext.getBean("husband", Husband.class);
        System.out.println(husband);

        Wife wife = applicationContext.getBean("wife", Wife.class);
        System.out.println(wife);
    }
5、測試結果

在這里插入圖片描述

6、結論

singleotn + setter模式下的循環依賴 spring是沒有任何問題的。
singleotn 表示在整個Spring容器當中是單例的,獨一無二的。

singleotn + setter模式下的循環依賴 spring是如何應對的?

主要原因是在這種模式下,Spring對Bean的管理主要分為清晰的兩個階段:
第一個階段:在Spring容器加載的時候,實例化Bean,只要其中任意一個Bean實例化之后,馬上進行“曝光”【不等屬性賦值就曝光】
第二個階段:Bean“曝光”之后,再進行屬性的賦值。
核心解決方案是:實例化對象和對象的屬性賦值分為兩個階段來完成的。
只有在scope是singleton的情況下,Bean才會采取提前“曝光”的措施

prototy+ setter模式下的循環依賴 spring是會出現異常的

在這里插入圖片描述
Bean的循環依賴出現問題:BeanCurrentlyInCreationException
注意:當兩個Bean的scope都是prototype的時候,才會出現異常,如果其中任意一個是singleton,就不會出現異常

二、Bean的循環依賴之構造方法注入模式下 1、Husband類

去掉set方法,加入構造方法

public class Husband {private String name;
    private Wife wife;

    public Husband(String name, Wife wife) {this.name = name;
        this.wife = wife;
    }
    public String getName() {return name;
    }
    @Override
    public String toString() {return "Husband{" +
                "name='" + name + '\'' +
                ", wife=" + wife.getName() +
                '}';
    }
}
2、Wife類

去掉set方法,加入構造方法

public class Wife {private String name;
    private Husband husband;

    public Wife(String name, Husband husband) {this.name = name;
        this.husband = husband;
    }

    @Override
    public String toString() {return "Wife{" +
                "name='" + name + '\'' +
                ", husband=" + husband.getName() +
                '}';
    }

    public String getName() {return name;
    }
}
3、Spring配置文件

構造注入,這種循環依賴是否會出現問題?

4、測試類
@Test
    public void testDeprndency(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring2.xml");
        Husband husband = applicationContext.getBean("husband", Husband.class);
        System.out.println(husband);

        Wife wife = applicationContext.getBean("wife", Wife.class);
        System.out.println(wife);
    }
5、運行結果

在這里插入圖片描述
注意:基于構造注入的方式下產生的循環依賴也是無法解決的

Spring只能解決set+singleton模式下的循環依賴。

三、Spring解決循環依賴的機理

根本原因在于:這種方式可以做到將“實例化Bean”和“給Bean屬性賦值”這兩個動作分開去完成。

  • 實例化Bean的時候:調用無參數構造方法來完成,此時可以先不給屬性賦值,可以提前將該Bean對象“曝光”給外界。
  • 給Bean對象屬性賦值的時候:調用setter方法來完成。

兩個步驟完全是可以分離開去完成的,并且不要求在同一時間點上完成。

也就是說Bean都是單例的,我們可以先把所有的單例Bean實例化出來,放到一個集合當中(緩存),所有的單例Bean全部實例化之后。我們再慢慢的調用setter方法給屬性賦值,這樣就解決了循環依賴的問題。

追源碼:
雙擊shift: AbstractAutowireCapableBeanFactory
ctrl + f :doCreateBean 方法

debug:
在這里插入圖片描述
繼續往下走一步:
這個husband對象的name屬性和wife屬性是空的,但是這個對象已經創建出來了
在這里插入圖片描述
走到下一個斷點:
在這里插入圖片描述
把這個單例對象緩存起來,具體看看怎么緩存的:

三級緩存(面試常問)

step into進去一個新的類:DefaultSingletonBeanRegistry

在這里插入圖片描述

先說說這個類DefaultSingletonBeanRegistry中的三個比較重要的緩存:
private final MapsingletonObjects ------ 一級緩存
private final MapearlySingletonObjects ------ 二級緩存
private final Map>singletonFactories ------ 三級緩存

這三個緩存都是Map集合。Map集合的key存儲的都是bean的name(bean id)。

一級緩存存儲的是:完整的單例Bean對象。也就是說這個緩存中的Bean對象的屬性都已經賦值了。是一個完整的Bean對象

二級緩存存儲的是:早期的單例Bean對象。這個緩存中的單例Bean對象的屬性沒有賦值,只是一個早期的實例對象

三級緩存存儲的是:單例工廠對象。這個里面存儲了大量的“工廠對象”,每一個單例Bean對象都會對應一個單例工廠對象。這個集合中存儲的是:創建該單例對象時對應的那個單例工廠對象

繼續回到debug:
進來DefaultSingletonBeanRegistry這個類之后addSingletonFactory這個方法執行
在這里插入圖片描述
繼續執行到:
并沒有把Bean對象存進去,是把創建Bean對象的工廠對象存放到map集合。(三級緩存)
往map對象存的這個動作就叫做“曝光”
在這里插入圖片描述
“曝光”工廠之后會繼續調用getSingleton方法
在這里插入圖片描述
然后從一級緩存取對象,拿不到從二級緩存取,拿不到從三級緩存取,
三級緩存取工廠對象,獲取這個Bean對象,再把Bean對象放到二級緩存。
在這里插入圖片描述
最后執行
populateBean(beanName, mbd, instanceWrapper);才會給屬性賦值


你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

當前標題:spring之Bean的循環依賴問題-創新互聯
本文路徑:http://m.2m8n56k.cn/article8/dsijop.html

成都網站建設公司_創新互聯,為您提供Google服務器托管建站公司關鍵詞優化微信公眾號外貿建站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

外貿網站制作
主站蜘蛛池模板: 综合中文字幕 | 成人免费视频一区二区 | 97国产大学生情侣11在线视频 | 私人玩物福利视频 | 国产真真人女人特级毛片 | 久久一区二区三区免费播放 | 国产高清精品久久久久久久 | 精品视频一区二区三区四区 | 456亚洲视频 | 国产精品日本欧美一区二区 | 黄色大片三级 | 欧美一级毛片免费大全 | 免费看久久 | 日韩一区在线播放 | 国产精品久久久久影院色 | 中文字幕一区视频一线 | 99视频在线观看视频 | 欧美一区二区在线观看免费网站 | 亚洲国产成人影院播放 | 亚洲精品中文字幕字幕 | 亚洲一区日韩一区欧美一区a | 99视频网址| 萌白酱粉嫩jk福利在线观看 | 欧美日韩精品一区二区在线线 | 日本亚欧乱色视频在线观看 | 国产看片一区二区三区 | 欧美精品国产一区二区三区 | 国产精品拍自在线观看 | 亚洲欧洲日产国码一级毛片 | 国产极品喷水视频jk制服 | 特级毛片aaaa免费观看 | 免费区欧美一级毛片精品 | 男女男精品视频免费观看 | 韩国毛片基地 | 美女张腿男人桶免费视频 | 亚洲精品国产精品一区二区 | 国产亚洲人成网站观看 | 在线天天干| 久久成人免费播放网站 | 国产最新自拍 | 天天看有黄有色大片 |