精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

国产三级在线观看视频| 三区四区在线观看| h片在线观看下载| 99麻豆久久久国产精品免费| 热99在线视频| 亚洲av无一区二区三区| 97超碰成人| 一本色道a无线码一区v| 四虎免费在线观看视频| 欧洲成人一区二区三区| 蜜桃av一区二区| 欧美精品18videos性欧| 鲁丝一区二区三区| 在线综合色站| 欧美亚洲动漫制服丝袜| 日韩精品综合在线| 国产高清免费在线播放| 国v精品久久久网| 国产成人午夜视频网址| 欧美精品videos极品| 国产欧美日韩精品一区二区三区 | 一区二区乱子伦在线播放| 欧美a级一区| 伊人久久五月天| 欧美一级片黄色| www久久久| 在线亚洲人成电影网站色www| 日本精品福利视频| 在线观看免费高清完整| 97se狠狠狠综合亚洲狠狠| 91精品在线观看视频| 无码人妻av免费一区二区三区 | 亚洲精品久久嫩草网站秘色| 欧美久久久久久| 黑人乱码一区二区三区av| 精品在线观看免费| 国产精品福利小视频| 日韩高清精品免费观看| 欧美精品入口| 另类少妇人与禽zozz0性伦| 欧美大波大乳巨大乳| 日韩系列在线| 亚洲第一福利在线观看| 18禁一区二区三区| 国产亚洲高清一区| 欧美妇女性影城| 日本三级黄色网址| 天天综合网站| 欧洲视频一区二区| 妞干网在线免费视频| 成人av免费电影网站| 欧美日韩国产中文精品字幕自在自线 | 国产成人精品三级高清久久91| 精品88久久久久88久久久| avtt中文字幕| 一级毛片精品毛片| 精品日韩在线一区| 91九色蝌蚪porny| 岛国成人av| 亚洲第一福利网| 亚洲精品女人久久久| 久久精品论坛| 亚洲男人天堂网站| 亚洲自拍偷拍图| 欧美丝袜丝交足nylons172| 亚洲性xxxx| 青青青视频在线播放| 99视频精品视频高清免费| 久久精品电影网站| 久草网站在线观看| 在线欧美福利| 欧美在线性爱视频| 中文在线观看av| 国产一区二区导航在线播放| 99在线影院| 熟妇人妻中文av无码| 成人夜色视频网站在线观看| 精品国产乱码久久久久久88av| 天天干天天爽天天操| 国产亚洲欧美日韩俺去了| 亚洲欧美日韩不卡一区二区三区| 成视频免费观看在线看| 亚洲一区二区三区国产| 精品一卡二卡三卡| 香蕉久久一区| 亚洲第一福利视频| 国产精品国产三级国产专业不| 999精品一区| 久久久久久久一区二区三区| www.国产一区二区| 激情深爱一区二区| 国产亚洲情侣一区二区无| 国内精品一区视频| 亚洲精品免费在线| 欧美v在线观看| 亚洲男人在线| 日韩精品在线视频| 成人在线观看高清| 香蕉久久a毛片| 91精品视频在线看| 日av在线播放| 亚洲精品大片www| 欧美日韩大尺度| 日本亚洲视频| 亚洲区一区二区| 欧美丰满艳妇bbwbbw| 新狼窝色av性久久久久久| 成人在线免费观看视视频| 无码精品视频一区二区三区| 国产亚洲一区二区三区四区| 亚洲激情免费视频| 国产国产一区| 精品夜色国产国偷在线| 欧美毛片在线观看| 欧美aaaaaa午夜精品| 国产一级精品aaaaa看| 久久精品视频观看| 欧美午夜影院一区| 欧美丰满少妇人妻精品| 影视一区二区| 国产精品自产拍在线观| 青青草手机在线| 亚洲国产精品久久久久秋霞影院 | 激情综合婷婷| 亚洲午夜精品久久久久久久久久久久| 久久久久久久久久久久久久免费看| 日日嗨av一区二区三区四区| 国内精品久久国产| 日韩电影免费观看| 51精品国自产在线| 国产传媒视频在线 | 在线看免费毛片| 国产免费av一区二区三区| 777777777亚洲妇女| 精品国产av一区二区| 国产精品美女久久久久久| 成人一区二区三| 免费国产自久久久久三四区久久| 色综合久综合久久综合久鬼88| 91资源在线视频| 中文字幕不卡在线| 国产超碰在线播放| 九一国产精品| 国产成人jvid在线播放| 色吊丝在线永久观看最新版本| 一区二区三区国产豹纹内裤在线| 亚洲精品第三页| 香港欧美日韩三级黄色一级电影网站| 国产精品免费久久久| 国产女人在线观看| 欧美视频日韩视频| 丁香花五月婷婷| 免费在线视频一区| 99re99热| 中文久久电影小说| 久久久在线视频| 色窝窝无码一区二区三区成人网站 | 色999五月色| 黄色成人在线视频| 日韩中文字幕国产精品| 亚洲一区二区视频在线播放| 国产精品国产三级国产三级人妇| 天天干天天玩天天操| 91精品一区二区三区综合| 成人激情免费在线| 在线观看免费视频你懂的| 精品日韩在线一区| 天天做天天爱夜夜爽| 国产亚洲1区2区3区| 日本高清久久久| 欧美人与禽猛交乱配视频| 国产精品免费一区二区三区观看| 多野结衣av一区| 亚洲香蕉伊综合在人在线视看| 中文字幕丰满人伦在线| 亚洲精品成人天堂一二三| 99热超碰在线| 日韩精品久久理论片| 久久精品二区| 丁香婷婷久久| 欧美精品xxx| 免费a在线观看| 7799精品视频| 在线观看国产亚洲| 国产精品区一区二区三区| 有码中文亚洲精品| 国产综合免费视频| 日韩免费高清| 91丨九色丨国产在线| 日韩子在线观看| 亚洲国产精品va在线看黑人动漫 | 一本色道久久综合| 日韩尤物视频| a级日韩大片| 国产精品久久久久久久久借妻| 成人影院在线看| 亚洲精品丝袜日韩| 国产精品美女一区| 高跟丝袜欧美一区| 日韩精品一区二区三区在线视频| 成人成人成人在线视频| 亚洲另类第一页| 亚洲啪啪91| 最新欧美日韩亚洲| 香蕉久久夜色精品国产使用方法 | 污污的网站免费| 亚洲区一区二| 中文字幕第一页亚洲| 国产传媒欧美日韩成人精品大片| 51午夜精品| 国产第一亚洲| 日韩av电影在线网| 国产理论电影在线| 久久久精品免费| 都市激情一区| 国产婷婷97碰碰久久人人蜜臀| 国产欧美日韩综合精品一区二区三区| 一本色道久久加勒比精品| 久久久久亚洲av无码专区| 国产精品久99| 韩国三级hd中文字幕| 93久久精品日日躁夜夜躁欧美 | 中文字幕精品一区二| 精品久久久香蕉免费精品视频| 日韩影院一区二区| 一区在线观看免费| 色欲AV无码精品一区二区久久| 91丨九色丨蝌蚪富婆spa| 亚洲欧美综合视频| 国产乱一区二区| 亚洲第一天堂久久| 久久99这里只有精品| 爱情岛论坛成人| 日韩成人av影视| 欧美视频第一区| 国产精品一二| 黄色一级视频片| 日韩视频久久| 国产视频九色蝌蚪| 亚洲精品极品| 自慰无码一区二区三区| 狠狠综合久久| 91精品国产91久久久久麻豆 主演| 在线成人直播| 免费看黄色a级片| 欧美有码视频| 久久人妻无码一区二区| 久久婷婷综合国产| 亚洲 中文字幕 日韩 无码| 一个色综合网| 亚洲色图都市激情| 亚洲综合婷婷| 国产黄色激情视频| 激情久久一区| 成人毛片一区二区| 亚洲少妇在线| 超碰影院在线观看| 麻豆91精品91久久久的内涵| 中文字幕第38页| 激情五月婷婷综合| aaa黄色大片| 99久久精品国产精品久久| 免费观看一级一片| 久久精品亚洲一区二区三区浴池| 精品国产成人亚洲午夜福利| 国产精品免费观看视频| 中日韩一级黄色片| 亚洲国产综合视频在线观看| 日韩三级小视频| 欧美性猛xxx| 中文字幕一区二区三区波野结 | 欧美国产激情18| 91超碰在线播放| 国产成人激情小视频| 亚洲精品无播放器在线播放| 北条麻妃高清一区| 亚洲小说图片| 国产高潮呻吟久久久| 合欧美一区二区三区| 免费观看精品视频| 狠狠色丁香久久婷婷综合_中| 不许穿内裤随时挨c调教h苏绵| caoporm超碰国产精品| x88av在线| 亚洲精品欧美激情| 精品不卡一区二区| 51精品国自产在线| 头脑特工队2在线播放| 中文字幕免费精品一区| 欧美videosex性极品hd| 欧洲美女免费图片一区| 超碰国产精品一区二页| 精品久久久久亚洲| 日韩在线理论| heyzo亚洲| 精品在线免费观看| 我和岳m愉情xxxⅹ视频| 亚洲欧美偷拍三级| 亚洲欧美综合自拍| 欧美一区二区精品在线| 麻豆av电影在线观看| 九九久久国产精品| 韩国成人在线| 国产尤物99| 亚洲男女av一区二区| 精品www久久久久奶水| 国产精品88888| 久久久久亚洲AV成人无在| 亚洲成人免费av| 国产精品自偷自拍| 亚洲欧洲一区二区三区久久| 欧美性video| 91精品久久久久久久久久入口| 亚洲97av| 人妻夜夜添夜夜无码av| 国产精品自拍av| 国产精品综合激情| 一本一本大道香蕉久在线精品| 亚洲成人第一区| 日韩视频免费观看| 成人看片网页| 久久综合入口| 一本久道久久综合狠狠爱| 久久av一区二区三| 亚洲视频中文字幕| 亚洲影视一区二区| 亚洲一品av免费观看| 亚洲优女在线| 精品久久久久久乱码天堂| 亚洲国产免费看| 中文字幕18页| 亚洲自拍偷拍麻豆| 99热这里只有精品5| 日韩在线播放一区| 日韩另类视频| 日韩av一区二区三区在线| 欧美亚洲自偷自偷| 中文字幕一区二区三区人妻不卡| 亚洲第一福利视频在线| 亚洲精品国产精品国| 欧美日韩国产第一页| 欧美三级一区| av一区二区三区免费观看| 国产精品18久久久| 2021亚洲天堂| 精品日韩成人av| 美洲精品一卡2卡三卡4卡四卡| 91黄在线观看| 红桃视频国产精品| 少妇激情一区二区三区视频| 亚洲国产sm捆绑调教视频| 天堂在线视频观看| 91爱视频在线| 国产欧美日韩免费观看| 在线观看高清免费视频| 国产精品久久久久久一区二区三区 | 亚洲最大av在线| 午夜精品久久| a天堂视频在线观看| 欧美性猛交xxxx| 超碰在线影院| 成人精品久久久| 欧美日韩一卡| 国产制服丝袜在线| 欧美在线色视频| 五月婷婷在线视频| av一区观看| 国产精品一区亚洲| 欧美黄色一级生活片| 欧美男男青年gay1069videost| 国产黄色小视频在线| 成人三级在线| 三级欧美韩日大片在线看| 手机av在线不卡| 日韩精品一区二区三区在线观看 | 欧美日韩一区二区在线观看视频| 色哟哟免费在线观看| av免费观看久久| 蘑菇福利视频一区播放| 四季av中文字幕| 精品国产凹凸成av人导航| 欧美日韩精品免费观看视完整| 在线看成人av电影| 成人av网在线| 中文区中文字幕免费看| 久久久久久久久久国产| 精品国产99| 妖精视频在线观看| 色哟哟日韩精品| 午夜影院免费在线| 青青草原成人| 国产不卡在线视频| 亚洲精品一区二三区| 久久久久久com| 欧美色婷婷久久99精品红桃| 国产chinesehd精品露脸| 欧美自拍丝袜亚洲| free性欧美| 国产树林野战在线播放| 久久久久久97三级|