精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring的循環(huán)依賴,到底是什么樣的

開發(fā) 前端
什么是循環(huán)依賴,說到循環(huán)依賴,這個實際上是沒有那么復雜的,就比如很簡單的說,A 引用了 B ,而這個時候 B 也引用了 A ,那么這種情況實際上就是出現(xiàn)了循環(huán)依賴的問題了,實際上也可以把循環(huán)依賴稱之為循環(huán)引用,兩個或者兩個以上的bean互相持有對方,最終形成閉環(huán)。

前一段時間,阿粉的讀者給阿粉留言,說在面試的時候,有個面試官就問她,Spring 的各種知識,Spring 的生命周期, Spring 的循環(huán)依賴是如何解決的。

就這么幾個問題,雖然回答的不是很好,但是也是很幸運的接到了 offer ,畢竟面試一般很少會因為一兩個面試題回答的不好,就直接 pass 的,還是看綜合表現(xiàn)的,既然問到阿粉這個 Spring 是如何處理循環(huán)依賴的了,那么阿粉就得來解釋一下,Spring 是如何處理循環(huán)依賴的。

循環(huán)依賴

什么是循環(huán)依賴,說到循環(huán)依賴,這個實際上是沒有那么復雜的,就比如很簡單的說,A 引用了 B ,而這個時候 B 也引用了 A ,那么這種情況實際上就是出現(xiàn)了循環(huán)依賴的問題了,實際上也可以把循環(huán)依賴稱之為循環(huán)引用,兩個或者兩個以上的bean互相持有對方,最終形成閉環(huán)。

這就是循環(huán)依賴,也就是循環(huán)引用,

圖片

注意,這里不是函數(shù)的循環(huán)調(diào)用,是對象的相互依賴關(guān)系。循環(huán)調(diào)用其實就是一個死循環(huán),除非有終結(jié)條件。否則的話,他就是一個死循環(huán).

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

那么 Spring 的循環(huán)依賴都有什么呢?

  • 構(gòu)造器的循環(huán)依賴
  • field屬性的循環(huán)依賴

那么針對這兩種循環(huán)依賴,Spring 它是如何解決的呢?這就很特殊了,構(gòu)造器的循環(huán)依賴問題實際上算是個無解的操作,只能拋出 BeanCurrentlyInCreationException 異常,也就是說,這個構(gòu)造器導致的循環(huán)依賴,Spring 是沒有辦法來處理的,也只是給拋出了異常,但是對于 字段屬性 的循環(huán)依賴,還是有解決辦法的。

Spring怎么解決循環(huán)依賴

這個時候,我們就得看看 Spring 的對象初始化的過程了,

Spring的單例對象的初始化主要分為三步:

  • createBeanInstance 實例化
  • populateBean 填充屬性
  • initializeBean 初始化

createBeanInstance 實例化實際上就是調(diào)用對象的構(gòu)造方法實例化對象,populateBean 實際上就是對 bean 的依賴屬性進行一個賦值填充,而 initializeBean 則是調(diào)用 Spring xml 中的 init 方法。

這個時候,我們看到這個初始化的過程,一般就應(yīng)該能猜到會發(fā)生 循環(huán)依賴? 的位置是哪一步了,而單從 bean 的初始化來看,循環(huán)依賴發(fā)生的位置就是在 createBeanInstance 實例化? 以及 populateBean 填充屬性 當中,

發(fā)生的循環(huán)依賴也是

  • 構(gòu)造器的循環(huán)依賴
  • field屬性的循環(huán)依賴

那么 Spring 又是怎么解決這種單例的循環(huán)依賴的問題的呢?

?三級緩存

那么這三級緩存分別是哪三級的緩存呢?又分別代表了什么含義?

  • singletonFactories :單例對象工廠的cache,用于存放完全初始化好的 bean,從該緩存中取出的 bean 可以直接使用
  • earlySingletonObjects :提前暴光的單例對象的Cache,存放原始的 bean 對象(尚未填充屬性),用于解決循環(huán)依賴
  • singletonObjects:單例對象的cache,存放 bean 工廠對象,用于解決循環(huán)依賴
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); //一級緩存
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16); // 二級緩存
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16); // 三級緩存

如果要分析這個 三級緩存 如何解決循環(huán)依賴,那么勢必需要知道 Spring 中對象的創(chuàng)建的過程。

對象創(chuàng)建過程,可以大致分為五個步驟,

1.protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheckOnly)

AbstractBeanFactory? 中的 doGetBean()方法

2.protected Object getSingleton(String beanName, boolean allowEarlyReference)

DefaultSingletonBeanRegistry? 中的 getSingleton()方法

  • 在這個方法中,先從一級緩存 singletonObjects 中去獲取。(如果獲取到就直接return)
  • 如果獲取不到,并且對象正在創(chuàng)建中,就再從二級緩存 earlySingletonObjects 中獲取。
  • 如果還是獲取不到且允許 singletonFactories? 通過 getObject()? 獲取,就從三級緩存singletonFactory.getObject()(三級緩存)獲取
  • 如果獲取到了則:從 singletonFactories? 中移除,并放入 earlySingletonObjects 中
  • 這就相當于 ctrl+x ,把三級緩存中的數(shù)據(jù)剪切到了二級緩存。

源碼如下:

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

3.protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)

AbstractAutowireCapableBeanFactory? 中的 doCreateBean() 方法

//添加到三級緩存
if (earlySingletonExposure) {
if (logger.isTraceEnabled()) {
logger.trace("Eagerly caching bean '" + beanName +
"' to allow for resolving potential circular references");
}
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}

4.protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw)

AbstractAutowireCapableBeanFactory? 中的 populateBean() 方法進行屬性賦值

5.protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd)

AbstractAutowireCapableBeanFactory? 中的 initializeBean() 初始化對象

源碼部分阿粉就不再往上貼那么多了,大家找源碼肯定很簡單,內(nèi)部也有具體方法的注釋,

Spring 解決循環(huán)依賴的訣竅就在于 singletonFactories 這個三級cache。

這個 cache 的類型是 ObjectFactory?。這里就是解決循環(huán)依賴的關(guān)鍵,發(fā)生在createBeanInstance之后,也就是說單例對象此時已經(jīng)被創(chuàng)建出來(調(diào)用了構(gòu)造器)。

這個對象已經(jīng)被生產(chǎn)出來了,雖然還不完美(還沒有進行初始化的第二步和第三步),但是已經(jīng)能被人認出來了(根據(jù)對象引用能定位到堆中的對象),所以Spring此時將這個對象提前曝光出來讓大家認識,讓大家使用。

如果你能在面試的時候,回答成這個樣子,那么這個問題,你至少已經(jīng)算是回答的比較好了。

但是如果問到這里,面試官有意想要繼續(xù)深挖一下,你既然知道使用三級緩存解決了這個循環(huán)依賴的問題了,那么是不是必須三級緩存才能解決,二級緩存不能解決嗎?

這就另外又給你引申出一個問題來了,二級緩存到底能不能解決呢?

其實,二級緩存也是能夠?qū)崿F(xiàn)的,如果自己想要實現(xiàn),那么就得去改寫 AbstractAutowireCapableBeanFactory? 的 doCreateBean 的方法了,

//添加到三級緩存
if (earlySingletonExposure) {
if (logger.isTraceEnabled()) {
logger.trace("Eagerly caching bean '" + beanName +
"' to allow for resolving potential circular references");
}
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
//從三級緩存中取出立刻放入二級緩存
getSingleton(beanName, true);
}

如果要使用二級緩存解決循環(huán)依賴,意味著Bean在構(gòu)造完后就創(chuàng)建代理對象,這樣違背了Spring設(shè)計原則。

Spring結(jié)合AOP跟Bean的生命周期,是在Bean創(chuàng)建完全之后通過AnnotationAwareAspectJAutoProxyCreator這個后置處理器來完成的,在這個后置處理的postProcessAfterInitialization方法中對初始化后的Bean完成AOP代理。

如果出現(xiàn)了循環(huán)依賴,那沒有辦法,只有給Bean先創(chuàng)建代理,但是沒有出現(xiàn)循環(huán)依賴的情況下,設(shè)計之初就是讓Bean在生命周期的最后一步完成代理而不是在實例化后就立馬完成代理。

所以,你知道為什么不使用二級緩存直接來處理了,而是增加了三級緩存來處理這個循環(huán)依賴了吧!


責任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2009-03-25 09:45:15

美國軟件公司工作環(huán)境

2013-05-16 10:00:11

2010-06-07 13:47:39

培訓

2023-11-28 08:00:00

SpringJava

2020-03-05 10:28:19

MySQLMRR磁盤讀

2022-10-08 00:00:00

Spring數(shù)據(jù)庫項目

2020-11-06 17:49:38

程序員技術(shù)開發(fā)

2022-02-28 10:16:12

算力網(wǎng)絡(luò)新基建東數(shù)西算

2009-10-26 13:36:10

BSM

2023-10-11 08:29:54

volatileJava原子性

2009-06-09 22:11:44

JavaScriptObject

2023-01-06 21:03:59

2013-08-29 11:38:53

企業(yè)App

2020-09-27 06:53:57

MavenCDNwrapper

2020-10-14 06:22:14

UWB技術(shù)感知

2010-11-01 01:25:36

Windows NT

2020-09-22 08:22:28

快充

2011-04-27 09:30:48

企業(yè)架構(gòu)

2022-10-30 15:03:25

人工智能倉庫管理機器人

2017-12-17 16:53:27

云計算亞馬遜云端
點贊
收藏

51CTO技術(shù)棧公眾號

国产午夜视频在线| 5月丁香婷婷综合| 国产日韩欧美电影在线观看| 男人女人拔萝卜视频| 日本在线视频www鲁啊鲁| 久久久久在线| 国产性猛交xxxx免费看久久| 成人av毛片在线观看| 24小时免费看片在线观看| 久久男人中文字幕资源站| 18在线观看的| 久久99日本精品| 欧美激情精品久久久久久久变态| 男人网站在线观看| 国产一区二区三区四区五区3d| 亚洲精品中文在线| 日本亚洲导航| 国产综合在线播放| 石原莉奈在线亚洲二区| 久久综合网hezyo| 国产毛片久久久久久| 午夜伦理福利在线| 中文字幕日本不卡| 欧美专区一二三| 亚洲成人av综合| 日韩激情视频在线观看| 亚洲3p在线观看| 久久久久久视频| 欧美艳星介绍134位艳星| 欧美日高清视频| 欧美私人情侣网站| 青草av在线| 日韩毛片在线免费观看| 欧美日韩免费精品| 农村少妇久久久久久久| 国产精品91一区二区| 国产精品网红福利| 少妇太紧太爽又黄又硬又爽| 99久久.com| 亚洲深夜福利在线| 人妻丰满熟妇av无码久久洗澡 | 秋霞av鲁丝片一区二区| 国产麻豆精品视频| 91久久国产精品91久久性色| 涩涩视频在线观看| 亚洲在线视频| 97视频在线观看视频免费视频| 在线日韩国产网站| 成人激情诱惑| 国产性猛交xxxx免费看久久| 亚洲黄色免费视频| 亚洲精品国产精品粉嫩| 亚洲精品中文字幕有码专区| 欧美熟妇精品黑人巨大一二三区| 加勒比色综合久久久久久久久| 91精品国产综合久久久久久漫画| 欧洲美女亚洲激情| 日韩av福利| 在线观看亚洲精品| 亚洲国产精品久久久久爰色欲| 成人性生交大片免费看网站| 性欧美大战久久久久久久久| 国产在线播放观看| 亚洲最新无码中文字幕久久| 日本精品免费观看高清观看| 九九视频精品在线观看| 国产成人精品一区二区三区免费| 日韩欧美第一页| 青青草av网站| **国产精品| 欧美精品九九99久久| 国内av一区二区| 777久久精品| 日韩精品电影网| 精品中文字幕在线播放| 麻豆成人入口| 亚洲欧美综合v| 扒开jk护士狂揉免费| 九热爱视频精品视频| 在线播放国产精品| 亚洲av网址在线| 成人国产精品一级毛片视频| 久久在线观看视频| 欧美三级韩国三级日本三斤在线观看| 中文欧美日韩| 国产精品国产三级国产aⅴ浪潮 | 亚洲精品国产一区黑色丝袜| 久久精品国产大片免费观看| 欧美大胆a视频| 91久久国产视频| 亚洲少妇一区| 成人午夜黄色影院| 午夜国产在线观看| 国产精品久久看| 黄色一级大片免费| 欧美电影免费观看| 日韩欧美视频一区| 99久久久久久久久久| 天天射天天综合网| 91精品国产亚洲| 最新国产中文字幕| 成人福利视频网站| 一区二区三区不卡在线| 美女露胸视频在线观看| 宅男噜噜噜66一区二区66| 中文字幕久久久久久久| 国产欧美一区| 久久免费观看视频| 国产精品国产三级国产普通话对白| 国产一区二区毛片| 国产综合欧美在线看| 91亚洲欧美| 亚洲一区二区综合| 色一情一区二区| 米奇777超碰欧美日韩亚洲| 色噜噜狠狠色综合网图区| 青青操视频在线播放| 亚洲欧美日韩在线观看a三区 | 色天下一区二区三区| 久久色在线播放| 紧身裙女教师波多野结衣| 伊人蜜桃色噜噜激情综合| 国产精品极品美女在线观看免费| 欧美一级在线免费观看| 国产精品毛片高清在线完整版| www.玖玖玖| 国产一级成人av| 精品综合久久久久久97| 亚洲一区二区影视| 国产欧美日韩不卡免费| jizzjizzxxxx| 欧美日韩中出| 欧美成人黄色小视频| 丰满人妻一区二区三区四区| 97aⅴ精品视频一二三区| 国产手机免费视频| 日韩中文字幕| 欧美大片在线看免费观看| 一区二区精品视频在线观看| 欧美国产精品一区| 无码人妻丰满熟妇区五十路百度| 牛牛影视一区二区三区免费看| 欧美床上激情在线观看| 国产高清免费在线观看| 亚洲视频你懂的| 91日韩精品视频| 久久久久国产精品| 91久久国产精品| 羞羞视频在线观看免费| 日韩久久免费av| 国产在线观看免费视频今夜| 高清成人免费视频| 国产日本在线播放| 久久成人福利| 久久久999国产精品| 亚洲中文字幕在线一区| 亚洲同性gay激情无套| 91视频福利网| 国产一区观看| 国产传媒一区二区| 在线观看的黄色| 亚洲人成免费电影| 成人免费区一区二区三区| 久久夜色精品国产噜噜av| 国产超级av在线| 国产精品手机在线播放 | 亚洲精品国产精品乱码视色| 国产蜜臀97一区二区三区| 幼a在线观看| 欧美先锋影音| 91在线播放视频| caopo在线| 精品国产乱码久久久久久蜜臀 | 99re这里只有精品在线| 久久精品人人做人人综合| www.欧美日本| 91精品综合久久久久久久久久久| 亚洲aⅴ男人的天堂在线观看 | 亚洲第一黄色片| 婷婷亚洲久悠悠色悠在线播放| 成年人在线观看av| 日本vs亚洲vs韩国一区三区二区| 亚洲高清资源综合久久精品| 天天综合在线观看| 久久久亚洲成人| yourporn在线观看视频| 69p69国产精品| 国产高潮久久久| 国产精品久久久久久久久久免费看| 操人视频免费看| 免费看亚洲片| 黄黄视频在线观看| 竹菊久久久久久久| 国产精品69久久| 国产绳艺sm调教室论坛| 久久99国内精品| 国产xxxx振车| 欧美日韩高清| av在线不卡观看| 四虎影视4hu4虎成人| 欧美成人合集magnet| 久草在线青青草| 精品日韩在线观看| 无码久久精品国产亚洲av影片| 欧美激情一区二区三区四区| 亚洲成a人片在线www| 午夜精品婷婷| 美日韩免费视频| 久久影院一区二区三区| 日韩美女在线播放| 免费av在线播放| 日韩精品免费一线在线观看| 国产99久久九九精品无码免费| 一本高清dvd不卡在线观看| 五级黄高潮片90分钟视频| 日本伊人色综合网| 黄色动漫网站入口| 在线精品观看| 一区二区三区四区免费观看| 国产精品一线天粉嫩av| 国产综合色一区二区三区| 亚洲成a人片777777久久| 欧美高清第一页| 日本视频在线免费观看| 亚洲国内高清视频| 亚洲国产999| 91精品国产综合久久久久久久久久 | а√在线天堂官网| 欧美精品在线极品| 黄视频在线观看网站| 日韩久久免费视频| 99热这里是精品| 欧美日韩一区国产| 国产精品尤物视频| 一本一道久久a久久精品 | 在线视频1区2区| 亚洲图片欧美日产| 韩日视频在线| 亚洲午夜未满十八勿入免费观看全集| 姝姝窝人体www聚色窝| 日韩午夜在线播放| 国产成人精品亚洲精品色欲| 欧美日韩aaa| 国产精品探花视频| 欧美日韩电影一区| 91禁在线观看| 欧美一区二区三区思思人| 亚洲自拍一区在线观看| 亚洲最大色网站| www.av成人| 亚洲欧洲三级电影| 一级黄色性视频| 国产精品色在线观看| 日本美女bbw| 国产精品久久久久久妇女6080| 亚洲精品天堂网| 国产精品理伦片| 四虎永久免费在线| 亚洲欧美区自拍先锋| 国产精品精品软件男同| 国产精品久久久久影视| 国产无遮挡在线观看| 久久亚洲精精品中文字幕早川悠里 | 亚洲色图av在线| porn亚洲| 免费91在线视频| av中文资源在线资源免费观看| 久精品免费视频| 17videosex性欧美| 欧美精品精品精品精品免费| 欧美gv在线| 国产精品日本精品| 国产日韩一区二区三免费高清 | 国产精品超碰| 精品一区二区国产| 自拍自偷一区二区三区| 色女人综合av| 欧美在线观看天堂一区二区三区| 丰满的少妇愉情hd高清果冻传媒| 国产日韩欧美一区二区三区在线观看| 欧美韩国日本在线| 精品一区二区三区蜜桃| 欧美xxxx日本和非洲| 久久久久久一二三区| 免费成人美女女在线观看| 亚洲中国最大av网站| 午夜精品三级久久久有码| 欧美日韩一本到| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | av2014天堂网| 国产三级精品视频| 真实国产乱子伦对白在线| 黑人巨大精品欧美一区二区三区| 在线观看国产小视频| 日韩欧美在线不卡| 国产资源在线看| 精品自拍视频在线观看| 经典三级一区二区| 粉嫩av四季av绯色av第一区| 欧美日韩精品在线一区| 日韩视频在线视频| 精品一区二区三区视频在线观看| 99久久免费看精品国产一区| 欧美经典三级视频一区二区三区| 久久国产精品二区| 欧美日韩国产色视频| av男人天堂av| 亚洲最新av在线| av毛片午夜不卡高**水| 91久热免费在线视频| 亚洲警察之高压线| 女人帮男人橹视频播放| 日韩va欧美va亚洲va久久| 污污污www精品国产网站| 国产欧美日韩久久| 日本视频免费在线| 欧美一区二区三区视频免费播放 | 黄色免费福利视频| 国产福利精品导航| 亚洲激情图片网| 欧美中文字幕一区| 青青青草网站免费视频在线观看| 精品少妇v888av| 亚洲精品69| 日韩亚洲欧美精品| 国产精品啊v在线| 国产欧美激情视频| 国产精品二区一区二区aⅴ污介绍| 精品国产xxx| 日韩av综合中文字幕| 丁香花在线观看完整版电影| 91亚洲国产成人精品性色| 成人区精品一区二区婷婷| 妞干网在线免费视频| 26uuu久久综合| 国产又黄又粗又爽| 亚洲福利视频久久| 黄页网站大全在线免费观看| 成人激情视频在线| 四虎成人精品永久免费av九九| 日韩 欧美 高清| 久久久www成人免费毛片麻豆| 麻豆成人在线视频| 欧美精品电影在线播放| 欧洲亚洲精品视频| 国产成人一区二区在线| 香蕉精品久久| 欧美激情精品久久久久久小说| 91免费观看视频在线| 手机看片久久久| 亚洲色图国产精品| 久久91视频| 亚洲视频电影| 国内久久精品视频| 国产av无码专区亚洲av毛网站| 欧美一区二区三区免费观看视频 | 午夜精品一区二区三区在线视 | 国产成人午夜高潮毛片| 久久久精品国产sm调教| 精品国产3级a| 亚洲欧美韩国| 久久婷婷人人澡人人喊人人爽| 西西人体一区二区| 久久精品一区二区免费播放| 欧美性xxxx| 免费a在线观看| 国产精品国产三级国产aⅴ9色| 91视频精品| 师生出轨h灌满了1v1| 午夜久久久久久| 国产福利免费在线观看| 91美女片黄在线观| 亚洲精品影视| 夫妇交换中文字幕| 欧美一区二区三区婷婷月色 | 国产精品扒开腿做爽爽爽男男| 日韩啪啪电影网| 老司机av网站| 疯狂蹂躏欧美一区二区精品| 丁香花免费高清完整在线播放| 欧美激情国产精品| 国产99精品| 亚洲国产日韩在线一区| 偷窥少妇高潮呻吟av久久免费| 人操人视频在线观看| 国产va免费精品高清在线| 日韩中文在线电影| 国产亚洲色婷婷久久| 偷偷要91色婷婷| 久久久久久女乱国产| 国产精品99免视看9| 亚洲色图国产| 人妻熟女aⅴ一区二区三区汇编| 欧美电影一区二区三区| 成人免费观看在线观看| 一区精品视频| 成人动漫精品一区二区| 一级全黄少妇性色生活片| 久久久久久国产免费| 欧美限制电影|