日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

spring解決循環(huán)依賴

瀏覽:77日期:2023-08-11 11:21:51

概述

循環(huán)依賴就是依賴關(guān)系形成環(huán),比如最簡(jiǎn)單的循環(huán)依賴:A對(duì)象依賴B,B對(duì)象依賴A

屬性注入與循環(huán)依賴

如果是構(gòu)造器注入,如果循環(huán)依賴對(duì)象沒法構(gòu)建,因?yàn)檫€未實(shí)例化 如果是屬性注入但是作用域是prototype,spring不會(huì)緩存其對(duì)象實(shí)例,也不能處理循環(huán)依賴的情況 如果是屬性注入singleton的,其bean的實(shí)例化過程與屬性注入過程是分開的,并且spring提供了三個(gè)map(就是大家說三級(jí)緩存)來實(shí)現(xiàn)。

spring屬性注入處理循環(huán)依賴的方式

通過以下xml方式配置一個(gè)循環(huán)依賴的示例:

<bean class='com.example.leetcode.spring.bean.Person'> <property name='parent' ref='person2'></property> <property name='name' value='tom'></property></bean><bean class='com.example.leetcode.spring.bean.Person'> <property name='parent' ref='person1'></property> <property name='name' value='jack'></property></bean>

spring循環(huán)依賴處理幾個(gè)關(guān)鍵位置:

獲取bean對(duì)象

protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException { final String beanName = transformedBeanName(name); Object bean; // 這里會(huì)檢查單例bean是否已經(jīng)在注冊(cè)表,并返回。 // Eagerly check singleton cache for manually registered singletons. Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) { if (logger.isTraceEnabled()) { if (isSingletonCurrentlyInCreation(beanName)) {logger.trace('Returning eagerly cached instance of singleton bean ’' + beanName + '’ that is not fully initialized yet - a consequence of a circular reference'); } else {logger.trace('Returning cached instance of singleton bean ’' + beanName + '’'); } } bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); } ...}

DefaultSingletonBeanRegistry(單例對(duì)象注冊(cè)表)的幾個(gè)關(guān)鍵屬性。

// 用來存儲(chǔ)已經(jīng)創(chuàng)建好的單例對(duì)象 /** Cache of singleton objects: bean name to bean instance. */ private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); // 用來存儲(chǔ)單例beanname到ObjectFactory的映射 /** Cache of singleton factories: bean name to ObjectFactory. */ private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16); // 用來提前存儲(chǔ)還未初始化好的單例對(duì)象 /** Cache of early singleton objects: bean name to bean instance. */ private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);

DefaultSingletonBeanRegistry.getSingleton()的實(shí)現(xiàn).

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;}

AbstractAutowireCapableBeanFactory.doCreateBean創(chuàng)建對(duì)象與注入屬性

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException { ... instanceWrapper = createBeanInstance(beanName, mbd, args); ... // 檢查是否提前將單例bean存入緩存 boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName)); if (earlySingletonExposure) { if (logger.isTraceEnabled()) { logger.trace('Eagerly caching bean ’' + beanName + '’ to allow for resolving potential circular references'); } // 這里將beanname與工廠映射放入緩存注冊(cè)表中(也就是上面的singletonFactories) addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)); } ... // 注入依賴屬性 populateBean(beanName, mbd, instanceWrapper); ...}

假設(shè)我們從beanfactory獲取person1對(duì)象, 循環(huán)依賴處理流程如下:

1.通過AbstractBeanFactory.doGetBean('persion1')獲取對(duì)象

2.因?yàn)橐婚_始通過DefaultSingletonBeanRegistry.getSingleton()什么都沒有,進(jìn)入AbstractAutowireCapableBeanFactory.doCreateBean()進(jìn)行創(chuàng)建

3.AutowireCapableBeanFactory.doCreateBean()里面執(zhí)行完創(chuàng)建邏輯,因?yàn)槭莝ingleton將beanname與工廠的映射加入到addSingletonFactory()到緩存

4.開始處理person1對(duì)象的屬性依賴populateBean()

5.當(dāng)發(fā)現(xiàn)person1的parent屬性是一個(gè)引用時(shí),通過beanfactory.getBean('person2')獲取依賴對(duì)象(org.springframework.beans.factory.support.BeanDefinitionValueResolver#resolveReference)

6.此時(shí)進(jìn)入person2的創(chuàng)建流程, person2也沒有緩存,開始實(shí)例化并加入到addSingletonFactory()到緩存

7.person2在通過populateBean()注入屬性依賴發(fā)現(xiàn)依賴person1, 此時(shí)通過beanfactory.getBean('person1')獲取依賴對(duì)象

8.此時(shí)AbstractBeanFactory.doGetBean('persion1')獲取對(duì)象執(zhí)行到getSingleton('person1')進(jìn)行以下判斷:

從singletonObjects.get(beanName)獲取到null 進(jìn)入if條件,對(duì)singletonObjects同步 從earlySingletonObjects.get(beanName);獲取也為null 進(jìn)入內(nèi)層if,通過singletonFactories.get(beanName);獲取到最開始bean實(shí)例化之后的beanname與工廠緩存信息 獲取到僅實(shí)例化完成的bean,并earlySingletonObjects.put(beanName, singletonObject); 然后刪除singletonFactories.remove(beanName);

9.此時(shí)從getSingleton('person1')返回了一個(gè)僅實(shí)例化尚未注入的bean引用

10.person2在第7步獲取到person1僅實(shí)例化未注入的對(duì)象引用。

11.person2完成屬性注入并返回。

12.person2被addSingleton(beanName, singletonObject);中singletonObjects.put(beanName, singletonObject)緩存,并刪除singletonFactories.remove(beanName);earlySingletonObjects.remove(beanName);

13.person1在5步獲取到person2的對(duì)象并完成屬性注入

14.person1對(duì)象返回(因?yàn)橐婚_始person2獲取的是person1的引用,此時(shí)person1完成注入是能看到注入后的對(duì)象)

15.person1被addSingleton(beanName, singletonObject);中singletonObjects.put(beanName, singletonObject)緩存,并刪除singletonFactories.remove(beanName);earlySingletonObjects.remove(beanName);

16.返回最終的person1對(duì)象

關(guān)于三個(gè)map(三級(jí)緩存)

在出現(xiàn)循環(huán)依賴時(shí),三個(gè)map之間的流程如下:

先從singletonFactories獲取工廠,并通過getObject獲取對(duì)象并移除緩存,將對(duì)象緩存到earlySingletonObjects通過earlySingletonObjects獲取提前曝光的對(duì)象對(duì)象創(chuàng)建并初始化完成之后,對(duì)象信息保留在singletonObjects并移除過earlySingletonObjects中的緩存

earlySingletonObjects二級(jí)緩存是雞肋嗎?

earlySingletonObjects緩存的目的是,通過三級(jí)緩存在獲取對(duì)象會(huì)執(zhí)行一些列的后置處理器,通過earlySingletonObjects來緩存提升性能。

以上就是spring解決循環(huán)依賴的詳細(xì)內(nèi)容,更多關(guān)于sping 循環(huán)依賴的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产成人精品999在线观看| 国产精品最新自拍| 国产一区二区三区四区| 国产亚洲高清在线观看| 婷婷综合电影| 亚洲精一区二区三区| 亚洲五月综合| 欧美一级久久| 牛牛精品成人免费视频| 美女久久久精品| 精品国产欧美日韩| 欧美日本精品| 久久精品国产精品亚洲毛片| 国产精品18| 成人亚洲欧美| 视频精品一区二区| 欧美中文高清| se01亚洲视频 | 五月天av在线| 悠悠资源网久久精品| 日韩综合小视频| 91日韩欧美| 在线国产精品一区| 福利片在线一区二区| 中文字幕人成乱码在线观看| 国产专区一区| 日韩1区2区3区| 国产精品久久久久久久久久10秀| 国产综合欧美| 久久99影视| 亚洲免费网址| 久久uomeier| 日韩三区四区| 99tv成人| 麻豆久久一区二区| 亚洲网址在线观看| 国产99在线| 久久国产精品色av免费看| 日韩欧美视频专区| 免费日韩一区二区| 亚洲精品一级二级| 久久一区精品| 欧美日韩视频免费看| 日韩在线卡一卡二| 欧美肉体xxxx裸体137大胆| 国产精品视频一区视频二区| 欧美专区18| 亚洲婷婷免费| 91精品国产调教在线观看| 久久av免费| 国产精品免费不| 欧美精品影院| 欧美亚洲三区| 欧美日韩午夜| 蜜桃久久久久久| 亚洲一区二区三区四区五区午夜 | 色爱av综合网| 国产成人精品一区二区三区视频| 日本中文字幕不卡| 日日夜夜免费精品| 欧美日韩在线精品一区二区三区激情综合| 五月天久久久| 日本精品影院| 亚洲最新无码中文字幕久久| 国产一区国产二区国产三区| 国产精品.xx视频.xxtv| 国产欧美久久一区二区三区| 日本特黄久久久高潮| 欧美有码在线| 麻豆一区二区三| 日韩欧美一区免费| 久久精品播放| 丝袜国产日韩另类美女| 亚洲精品影视| 久久wwww| 播放一区二区| 在线观看一区| 精品一区视频| 九九久久国产| 在线日韩视频| 亚洲精品福利| 国产成人精品一区二区三区在线| 日本免费一区二区三区四区| 狠狠久久婷婷| 91精品视频一区二区| 精品久久91| 久久av一区| 久久中文字幕一区二区| 欧美.日韩.国产.一区.二区| 婷婷综合国产| 亚洲伦乱视频| 欧美日韩中出| 中文国产一区| 欧美久久一区二区三区| 欧美羞羞视频| 亚洲精品伊人| 精品捆绑调教一区二区三区| 四虎精品一区二区免费| 日韩欧美精品一区| 国产精品美女午夜爽爽| 亚洲深夜av| 色爱综合网欧美| 婷婷综合电影| 亚洲免费婷婷| 欧美日韩尤物久久| 久久在线91| 91精品啪在线观看国产爱臀| 亚洲精品一区二区妖精| 日本色综合中文字幕| 九一国产精品| 色综合狠狠操| 国产剧情一区| 欧美综合精品| 日韩精品1区2区3区| 久久先锋影音| aⅴ色国产欧美| 亚洲五月婷婷| 精品欧美一区二区三区在线观看| 日韩精品视频中文字幕| 免费欧美日韩| 久久99伊人| 亚洲一区成人| 老鸭窝亚洲一区二区三区| 国产精品yjizz视频网| 久久伊人国产| 国产suv精品一区二区四区视频| 三级在线观看一区二区| 国产欧美三级| 日韩精品高清不卡| 香蕉久久国产| 亚洲欧洲日本mm| 99成人在线| 日韩超碰人人爽人人做人人添| 在线视频亚洲| 亚洲黄色影院| 亚洲综合丁香| 免费看欧美美女黄的网站| 乱人伦精品视频在线观看| 久久激情中文| 好看的亚洲午夜视频在线| 久久国产66| 日本视频一区二区| 久久午夜影院| 亚洲大全视频| 一区二区国产在线观看| 日韩一区二区三免费高清在线观看 | 久久网站免费观看| 日韩一区精品字幕| 亚洲69av| 久久精品亚洲| 亚洲成人日韩| 国产精品一区二区美女视频免费看 | 日韩影院精彩在线| 国产精品久久久一区二区| 正在播放日韩精品| 欧美午夜不卡影院在线观看完整版免费| 视频一区二区不卡| 欧美91在线|欧美| 久久精品不卡| 国产日韩精品视频一区二区三区| 国产一区二区视频在线看| 亚洲精品123区| 欧美激情91| 亚洲一区日本| 色婷婷综合网| 国产欧美一区二区色老头| 亚洲二区免费| 激情不卡一区二区三区视频在线| 日韩在线卡一卡二| 色老板在线视频一区二区| 日韩精品一级中文字幕精品视频免费观看| 久久精品99国产精品| 久久av在线| 欧美91精品| 蜜臀国产一区| 精品视频在线你懂得| 日韩一区二区三区免费视频| 日韩精品午夜| 国产成人精品免费视| 久久精品99国产精品| 免费久久99精品国产| 激情欧美丁香| 日本在线精品| 日韩1区2区| 精品国产鲁一鲁****| 一区二区国产在线观看| 国产尤物精品| 黄色在线观看www| 国产精品hd| 国产精品巨作av| 国产精品分类| 国产精品白丝一区二区三区| 四虎精品一区二区免费| 日韩在线成人| 视频一区中文字幕精品| 中文字幕一区二区三区日韩精品| 亚洲一区国产| 日韩三区四区| 国产精品白浆| 日韩av自拍|