成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

研究一下Spring里面的源碼,循環(huán)依賴(lài)你會(huì)么?

開(kāi)發(fā) 前端
因?yàn)橐粋€(gè)Spring的問(wèn)題,期望薪資三萬(wàn)卻被生生的壓榨成了兩萬(wàn)五,高于兩萬(wàn)五人家都不要,讓我感覺(jué)到了Spring的強(qiáng)大,不學(xué)習(xí)Spring是會(huì)吃虧的,那么我們就從各種高頻面試來(lái)一點(diǎn)點(diǎn)深入吧。

前幾天在阿粉CSDN上看一個(gè)文章,因?yàn)橐粋€(gè)Spring的問(wèn)題,期望薪資三萬(wàn)卻被生生的壓榨成了兩萬(wàn)五,高于兩萬(wàn)五人家都不要,讓我感覺(jué)到了Spring的強(qiáng)大,不學(xué)習(xí)Spring是會(huì)吃虧的,那么我們就從各種高頻面試來(lái)一點(diǎn)點(diǎn)深入吧。

[[326389]]

本文先從一個(gè)高頻面試題開(kāi)始說(shuō)起吧!阿粉在接下來(lái)會(huì)給大家?guī)?lái)各種關(guān)于Spring的知識(shí),希望大家能夠一起討論一下呦

Spring是怎么去解決循環(huán)依賴(lài)的

1.什么是循環(huán)依賴(lài)

這個(gè)詞,阿粉聽(tīng)到的時(shí)候,肯定和大家的反應(yīng)一樣的,循環(huán),依賴(lài),那是不是 A 引用了 B ,而此時(shí) B 引用了 C,而 C 呢又引用了A,于是一個(gè)三角戀的關(guān)系出現(xiàn)了。

 

那么用代碼來(lái)表示的話(huà),是怎么表示的呢?

  1. public class ClassTestA { 
  2.  
  3.     private ClassTestB classTestB; 
  4.  
  5.     public void a(){ 
  6.         classTestB.b(); 
  7.     } 
  8.  
  9.     public ClassTestB getClassTestB() { 
  10.         return classTestB; 
  11.     } 
  12.     private void setClassTestB(ClassTestB classTestB){ 
  13.         this.classTestB = classTestB; 
  14.     } 
  15.  
  16. public class ClassTestB { 
  17.  
  18.     private ClassTestC classTestC; 
  19.  
  20.     public void b(){ 
  21.         classTestC.c(); 
  22.     } 
  23.  
  24.     public ClassTestC getClassTestC() { 
  25.         return classTestC; 
  26.     } 
  27.     private void setClassTestC(ClassTestC classTestC){ 
  28.         this.classTestC = classTestC; 
  29.     } 
  30.  
  31. public class ClassTestC { 
  32.  
  33.     private ClassTestA classTestA; 
  34.  
  35.     public void c(){ 
  36.         classTestA.a(); 
  37.     } 
  38.  
  39.     public ClassTestA getClassTestA() { 
  40.         return classTestA; 
  41.     } 
  42.     private void setClassTestA(ClassTestA classTestA){ 
  43.         this.classTestA = classTestA; 
  44.     } 

 

2.循環(huán)依賴(lài)會(huì)出現(xiàn)什么問(wèn)題

在阿粉的印象中,循環(huán)依賴(lài)最直接的問(wèn)題就是會(huì)出現(xiàn)在對(duì)象的實(shí)例化上面,創(chuàng)建對(duì)象的時(shí)候,如果在Spring的配置中加入這種 A 依賴(lài) B ,B 依賴(lài) C,C 依賴(lài) A 的話(huà),那么最終創(chuàng)建 A 的實(shí)例對(duì)象的時(shí)候,會(huì)出現(xiàn)錯(cuò)誤。

而如果這種循環(huán)調(diào)用的依賴(lài)不去終結(jié)掉他的話(huà),那么就相當(dāng)于一個(gè)死循環(huán),就像阿粉前幾天的在維護(hù)那個(gè) “十六年”之前的項(xiàng)目的時(shí)候,各種內(nèi)存溢出,表示內(nèi)心很壓抑呀。

而 Spring 中也將循環(huán)依賴(lài)的處理分成了不同的幾種情況,阿粉帶大家來(lái)看一下吧。

3.Spring循環(huán)依賴(lài)處理一 (構(gòu)造器循環(huán)依賴(lài))

構(gòu)造器循環(huán)依賴(lài)的意思就是說(shuō),通過(guò)構(gòu)造及注入構(gòu)成的循環(huán)依賴(lài),而這種依賴(lài)的話(huà),是沒(méi)有辦法解決的,如果你敢強(qiáng)行依賴(lài),不要意思,出現(xiàn)了你久違的異常 BeanCurrentlyInCreationException 出現(xiàn)這個(gè)異常的時(shí)候,就是表示循環(huán)依賴(lài)的問(wèn)題。

相信大家出現(xiàn)異常的時(shí)候,在看不懂為什么的時(shí)候,第一時(shí)間,復(fù)制異常信息,放在百度,或者Google上面查詢(xún)一下,BeanCurrentlyInCreationException 放在百度上,一目了然。

而在 Spring 的配置文件中,如果這么配置 A ,B ,C 的循環(huán)依賴(lài)的時(shí)候,在創(chuàng)建 A 的時(shí)候,發(fā)現(xiàn),構(gòu)造器需要 B 類(lèi),然后去創(chuàng)建 B ,而創(chuàng)建 B 的時(shí)候,發(fā)現(xiàn)又需要 C ,然后去創(chuàng)建 C ,創(chuàng)建的時(shí)候發(fā)現(xiàn),竟然需要 A ,于是又掉頭回去了,于是就形成了一個(gè)閉環(huán),沒(méi)有辦法創(chuàng)建。

  1. <beans> 
  2.  
  3.   <bean id="ClassTestA" class="com.yldlsy.ClassTestA" > 
  4.         <constructor-arg index="0" ref="ClassTestB" /> 
  5.   </bean> 
  6.  
  7.   <bean id="ClassTestB" class="com.yldlsy.ClassTestB" > 
  8.         <constructor-arg index="0" ref="ClassTestC" /> 
  9.   </bean> 
  10.  
  11.   <bean id="ClassTestC" class="com.yldlsy.ClassTestC" > 
  12.          <constructor-arg index="0" ref="ClassTestA" /> 
  13.   </bean> 
  14. </beans> 

而在這種情況下,Spring實(shí)例化bean是通過(guò)ApplicationContext.getBean()方法來(lái)進(jìn)行的。如果要獲取的對(duì)象依賴(lài)了另一個(gè)對(duì)象,那么其首先會(huì)創(chuàng)建當(dāng)前對(duì)象,然后通過(guò)遞歸的調(diào)用ApplicationContext.getBean()方法來(lái)獲取所依賴(lài)的對(duì)象,最后將獲取到的對(duì)象注入到當(dāng)前對(duì)象中。而和剛才阿粉說(shuō)的一樣,創(chuàng)建了閉環(huán),所以就沒(méi)有辦法創(chuàng)建了。

4.Spring循環(huán)依賴(lài)處理二(setter循環(huán)依賴(lài))

setter循環(huán)注入是指通過(guò)setter注入方式構(gòu)成的循環(huán)依賴(lài)。而這種方式,是Spring可以進(jìn)行解決的。

而對(duì)于這種使用setter注入造成的依賴(lài)是通過(guò)Spring容器來(lái)提前暴露剛完成的構(gòu)造注入器的bean來(lái)完成的,但是這時(shí)候還沒(méi)有完成其他的步驟的時(shí)候。

這個(gè)時(shí)候我們就需要提前暴露出來(lái)一個(gè)單例的工廠方法,讓其他的bean來(lái)引用這個(gè)bean,

  1. addSingletonFactory(beanName,new ObjectFactory(){ 
  2.     public Object getObject() throws BeanException{ 
  3.         return getEarlyBeanReference(beanName,mbd,bean) 
  4.     } 
  5. }) 
  • Spring在創(chuàng)建 A 的時(shí)候,根據(jù)無(wú)參構(gòu)造來(lái)創(chuàng)建 A,并且暴露出 ObjectFactory 用來(lái)返回一個(gè)提前暴露好的 bean 然后再進(jìn)行setter來(lái)注入,

同理的B和C都是這個(gè)樣子的,這個(gè)時(shí)候就能完成setter注入了。

5.Spring循環(huán)依賴(lài)處理三(作用域循環(huán)依賴(lài))

阿粉帶大家看一下這個(gè)配置方式

  1. <bean id="ClassTestA" class="com.yldlsy.ClassTestA" scope="singleton" > 
  2.         <property name="ClassTestB" ref="ClassTestB" /> 
  3.     </bean> 
  4.     <bean id="ClassTestA" class="com.yldlsy.ClassTestA" scope="singleton" > 
  5.             <property name="ClassTestB" ref="ClassTestB" /> 
  6.      </bean> 
  7.      <bean id="ClassTestA" class="com.yldlsy.ClassTestA" scope="singleton" > 
  8.              <property name="ClassTestB" ref="ClassTestB" /> 
  9.       </bean> 

而對(duì)于 “singleton”作用域的話(huà),他是可以通過(guò)“setAllowCircularReference(false)”這種方式來(lái)進(jìn)制循環(huán)依賴(lài)的。

而且也是有缺陷的,這種方式只能解決單例作用域的bean循環(huán)依賴(lài)。

而Spring解決循環(huán)依賴(lài)的話(huà),大家肯定會(huì)好奇,說(shuō)是三級(jí)緩存,那么請(qǐng)找到你的Spring的源碼

  1. org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean 

里面代碼之前阿粉就說(shuō)過(guò),太多了,給大家發(fā)一下阿粉之前的鏈接,里面有詳細(xì)介紹Bean加載的所有過(guò)程。

 

文獻(xiàn)參考《Spring源碼深度解析》

 

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

2022-05-24 13:09:28

區(qū)塊鏈

2021-07-06 07:21:16

Spring 安全平臺(tái)

2024-03-01 18:55:54

內(nèi)存調(diào)試Go 語(yǔ)言

2019-09-09 06:30:06

Springboot程序員開(kāi)發(fā)

2023-11-09 17:29:06

2021-12-27 18:00:30

對(duì)象數(shù)組Java

2022-08-17 07:52:31

Spring循環(huán)依賴(lài)單例池

2024-06-05 11:43:10

2023-05-04 08:06:27

Spring循環(huán)依賴(lài)

2022-09-23 15:01:33

圖片加載代碼

2023-11-29 08:00:53

JavaTreeMap底層

2024-04-15 08:17:21

Spring依賴(lài)注入循環(huán)依賴(lài)

2025-03-17 00:21:00

2020-06-10 07:38:30

Spring框架周期

2022-03-25 09:01:36

Spring循環(huán)依賴(lài)面試

2023-08-18 20:50:22

2014-07-18 17:14:16

小米蘋(píng)果雷軍

2021-01-28 10:23:26

Seata模式分布式

2023-05-09 08:25:26

Gaussdb數(shù)據(jù)庫(kù)開(kāi)源數(shù)據(jù)庫(kù)

2015-02-04 10:46:59

AppleWatchuber
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 国产精品久久精品 | 激情国产在线 | 一级毛片视频免费观看 | 久久久久久久久久久一区二区 | 一区二区三区国产 | 欧美黄色网 | 国产目拍亚洲精品99久久精品 | 亚洲一区| 天天色综网 | 精品久久精品 | 欧日韩不卡在线视频 | 农夫在线精品视频免费观看 | 99久久99久久精品国产片果冰 | 亚洲精品久久国产高清情趣图文 | 少妇一区在线观看 | 黄色一级电影免费观看 | 99精品免费久久久久久久久日本 | 精品乱码一区二区 | 国产亚洲一区二区三区在线观看 | 欧美一区不卡 | 日韩成人在线网站 | 少妇精品亚洲一区二区成人 | 久久亚洲国产精品日日av夜夜 | 激情福利视频 | 国产色婷婷 | 久久久久久国产精品 | 免费成人高清在线视频 | av首页在线 | 国产一级特黄视频 | 欧美不卡一区二区三区 | 日韩国产欧美一区 | 99一区二区 | 国产精品一区二 | 亚洲天堂网站 | 久久手机视频 | 色婷婷综合久久久中文字幕 | 日日操网站 | 欧美成人hd | 久久一| 亚洲高清在线免费观看 | 国产1区2区在线观看 |