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

Spring解決循環(huán)依賴的3種方式!

開發(fā) 后端
循環(huán)依賴就是N個(gè)類中循環(huán)嵌套引用,如果在日常開發(fā)中我們用new 對(duì)象的方式發(fā)生這種循環(huán)依賴的話程序會(huì)在運(yùn)行時(shí)一直循環(huán)調(diào)用,直至內(nèi)存溢出報(bào)錯(cuò)。

[[314515]]

循環(huán)依賴就是N個(gè)類中循環(huán)嵌套引用,如果在日常開發(fā)中我們用new 對(duì)象的方式發(fā)生這種循環(huán)依賴的話程序會(huì)在運(yùn)行時(shí)一直循環(huán)調(diào)用,直至內(nèi)存溢出報(bào)錯(cuò)。

下面說一下Spring是如果解決循環(huán)依賴的。

第一種:構(gòu)造器參數(shù)循環(huán)依賴

Spring容器會(huì)將每一個(gè)正在創(chuàng)建的Bean 標(biāo)識(shí)符放在一個(gè)“當(dāng)前創(chuàng)建Bean池”中,Bean標(biāo)識(shí)符在創(chuàng)建過程中將一直保持在這個(gè)池中。

因此如果在創(chuàng)建Bean過程中發(fā)現(xiàn)自己已經(jīng)在“當(dāng)前創(chuàng)建Bean池”里時(shí)將拋出BeanCurrentlyInCreationException異常表示循環(huán)依賴;而對(duì)于創(chuàng)建完畢的Bean將從“當(dāng)前創(chuàng)建Bean池”中清除掉。

首先我們先初始化三個(gè)Bean。 

  1. public class StudentA {  
  2.     private StudentB studentB ;  
  3.     public void setStudentB(StudentB studentB) {  
  4.         this.studentB = studentB;  
  5.     }  
  6.     public StudentA() {  
  7.     }  
  8.     public StudentA(StudentB studentB) {  
  9.         this.studentB = studentB;  
  10.     }  
  11.  
  1. public class StudentB {  
  2.     private StudentC studentC ;  
  3.     public void setStudentC(StudentC studentC) {  
  4.         this.studentC = studentC;  
  5.     }  
  6.     public StudentB() {  
  7.     }  
  8.     public StudentB(StudentC studentC) {  
  9.         this.studentC = studentC;  
  10.     }  
  11.  
  1. public class StudentC {  
  2.     private StudentA studentA ;  
  3.     public void setStudentA(StudentA studentA) {  
  4.         this.studentA = studentA;  
  5.     }  
  6.     public StudentC() {  
  7.     }  
  8.     public StudentC(StudentA studentA) {  
  9.         this.studentA = studentA;  
  10.     }  

OK,上面是很基本的3個(gè)類,StudentA有參構(gòu)造是StudentB。StudentB的有參構(gòu)造是StudentC,StudentC的有參構(gòu)造是StudentA ,這樣就產(chǎn)生了一個(gè)循環(huán)依賴的情況。

我們都把這三個(gè)Bean交給 Spring 管理,并用有參構(gòu)造實(shí)例化。 

  1. <bean id="a" class="com.zfx.student.StudentA">  
  2.   <constructor-arg index="0" ref="b"></constructor-arg>  
  3. </bean>  
  4. <bean id="b" class="com.zfx.student.StudentB">  
  5.   <constructor-arg index="0" ref="c"></constructor-arg>  
  6. </bean>  
  7. <bean id="c" class="com.zfx.student.StudentC">  
  8.   <constructor-arg index="0" ref="a"></constructor-arg>  
  9. </bean> 

下面是測(cè)試類: 

  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         ApplicationContext context = new ClassPathXmlApplicationContext("com/zfx/student/applicationContext.xml");  
  4.         //System.out.println(context.getBean("a", StudentA.class));  
  5.     }  

執(zhí)行結(jié)果報(bào)錯(cuò)信息為: 

  1. Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException:  
  2.   Error creating bean with name 'a': Requested bean is currently in creation: Is there an unresolvable circular reference? 

如果大家理解開頭那句話的話,這個(gè)報(bào)錯(cuò)應(yīng)該不驚訝,Spring容器先創(chuàng)建單例StudentA,StudentA依賴StudentB,然后將A放在“當(dāng)前創(chuàng)建Bean池”中。

此時(shí)創(chuàng)建StudentB,StudentB依賴StudentC ,然后將B放在“當(dāng)前創(chuàng)建Bean池”中,此時(shí)創(chuàng)建StudentC,StudentC又依賴StudentA。

但是,此時(shí)Student已經(jīng)在池中,所以會(huì)報(bào)錯(cuò),因?yàn)樵诔刂械腂ean都是未初始化完的,所以會(huì)依賴錯(cuò)誤 ,初始化完的Bean會(huì)從池中移除。

第二種:setter方式單例,默認(rèn)方式

如果要說setter方式注入的話,我們最好先看一張Spring中Bean實(shí)例化的圖

如圖中前兩步驟得知:Spring是先將Bean對(duì)象實(shí)例化之后再設(shè)置對(duì)象屬性的,Spring 中的 bean 為什么默認(rèn)單例, 這篇建議大家看下。

關(guān)注微信公眾號(hào):Java技術(shù)棧,在后臺(tái)回復(fù):spring,可以獲取我整理的 N 篇最新 Spring 教程,都是干貨。

修改配置文件為set方式注入 

  1. <!--scope="singleton"(默認(rèn)就是單例方式) -->  
  2. <bean id="a" class="com.zfx.student.StudentA" scope="singleton">  
  3.   <property name="studentB" ref="b"></property>  
  4. </bean>  
  5. <bean id="b" class="com.zfx.student.StudentB" scope="singleton">  
  6.   <property name="studentC" ref="c"></property>  
  7. </bean>  
  8. <bean id="c" class="com.zfx.student.StudentC" scope="singleton">  
  9.   <property name="studentA" ref="a"></property>  
  10. </bean> 

下面是測(cè)試類: 

  1. public class Test {  
  2.     public static void main(String[] args) { 
  3.         ApplicationContext context = new ClassPathXmlApplicationContext("com/zfx/student/applicationContext.xml");  
  4.         System.out.println(context.getBean("a", StudentA.class));  
  5.     }  

打印結(jié)果為: 

  1. com.zfx.student.StudentA@1fbfd6 

為什么用set方式就不報(bào)錯(cuò)了呢 ?

我們結(jié)合上面那張圖看,Spring先是用構(gòu)造實(shí)例化Bean對(duì)象 ,此時(shí) Spring 會(huì)將這個(gè)實(shí)例化結(jié)束的對(duì)象放到一個(gè)Map中,并且 Spring 提供了獲取這個(gè)未設(shè)置屬性的實(shí)例化對(duì)象引用的方法。 

結(jié)合我們的實(shí)例來看,當(dāng)Spring實(shí)例化了StudentA、StudentB、StudentC后,緊接著會(huì)去設(shè)置對(duì)象的屬性,此時(shí)StudentA依賴StudentB,就會(huì)去Map中取出存在里面的單例StudentB對(duì)象,以此類推,不會(huì)出來循環(huán)的問題嘍、

下面是Spring源碼中的實(shí)現(xiàn)方法。以下的源碼在Spring的Bean包中的DefaultSingletonBeanRegistry.java類中 

  1. /** Cache of singleton objects: bean name --> bean instance(緩存單例實(shí)例化對(duì)象的Map集合) */  
  2. private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(64);  
  3. /** Cache of singleton factories: bean name --> ObjectFactory(單例的工廠Bean緩存集合) */  
  4. private final Map<String, ObjectFactory> singletonFactories = new HashMap<String, ObjectFactory>(16);  
  5. /** Cache of early singleton objects: bean name --> bean instance(早期的單身對(duì)象緩存集合) */  
  6. private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);  
  7. /** Set of registered singletons, containing the bean names in registration order(單例的實(shí)例化對(duì)象名稱集合) */  
  8. private final Set<String> registeredSingletons = new LinkedHashSet<String>(64);  
  9. /**  
  10.  * 添加單例實(shí)例  
  11.  * 解決循環(huán)引用的問題  
  12.  * Add the given singleton factory for building the specified singleton  
  13.  * if necessary.  
  14.  * <p>To be called for eager registration of singletons, e.g. to be able to  
  15.  * resolve circular references.  
  16.  * @param beanName the name of the bean  
  17.  * @param singletonFactory the factory for the singleton object  
  18.  */  
  19. protected void addSingletonFactory(String beanName, ObjectFactory singletonFactory) {  
  20.   Assert.notNull(singletonFactory, "Singleton factory must not be null");  
  21.   synchronized (this.singletonObjects) {  
  22.     if (!this.singletonObjects.containsKey(beanName)) {  
  23.       this.singletonFactories.put(beanName, singletonFactory);  
  24.       this.earlySingletonObjects.remove(beanName);  
  25.       this.registeredSingletons.add(beanName);  
  26.     }  
  27.   }  

第三種:setter方式原型,prototype

修改配置文件為: 

  1. <bean id="a" class="com.zfx.student.StudentA" scope="prototype">  
  2.   <property name="studentB" ref="b"></property>  
  3. </bean>  
  4. <bean id="b" class="com.zfx.student.StudentB" scope="prototype">  
  5.   <property name="studentC" ref="c"></property>  
  6. </bean>  
  7. <bean id="c" class="com.zfx.student.StudentC" scope="prototype">  
  8.   <property name="studentA" ref="a"></property>  
  9. </bean> 

scope="prototype" 意思是 每次請(qǐng)求都會(huì)創(chuàng)建一個(gè)實(shí)例對(duì)象。

兩者的區(qū)別是:有狀態(tài)的bean都使用Prototype作用域,無狀態(tài)的一般都使用singleton單例作用域。

測(cè)試用例: 

  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         ApplicationContext context = new ClassPathXmlApplicationContext("com/zfx/student/applicationContext.xml");  
  4.         //此時(shí)必須要獲取Spring管理的實(shí)例,因?yàn)楝F(xiàn)在scope="prototype" 只有請(qǐng)求獲取的時(shí)候才會(huì)實(shí)例化對(duì)象  
  5.         System.out.println(context.getBean("a", StudentA.class));  
  6.     }  

打印結(jié)果: 

  1. Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException:  
  2.     Error creating bean with name 'a': Requested bean is currently in creation: Is there an unresolvable circular reference? 

為什么原型模式就報(bào)錯(cuò)了呢 ?

對(duì)于“prototype”作用域Bean,Spring容器無法完成依賴注入,因?yàn)?ldquo;prototype”作用域的Bean,Spring容器不進(jìn)行緩存,因此無法提前暴露一個(gè)創(chuàng)建中的Bean。 

 

責(zé)任編輯:龐桂玉 來源: Java技術(shù)棧
相關(guān)推薦

2019-11-26 14:30:20

Spring循環(huán)依賴Java

2009-09-08 15:22:20

Spring依賴注入

2020-12-29 08:34:08

spring循環(huán)依賴開發(fā)

2023-10-07 08:40:57

緩存屬性Spring

2024-04-12 07:51:05

SpringBean初始化

2022-08-17 07:52:31

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

2023-11-28 08:00:00

SpringJava

2022-05-08 19:23:28

Spring循環(huán)依賴

2023-05-04 08:06:27

Spring循環(huán)依賴

2023-12-12 17:44:13

三級(jí)緩存Bean

2025-03-17 00:21:00

2023-05-26 07:19:49

Spring聲明式事務(wù)

2020-06-22 08:07:48

Spring依賴場(chǎng)景

2025-03-20 08:00:00

@LazySpring開發(fā)

2024-06-05 11:43:10

2021-09-01 11:45:10

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

2011-02-28 13:51:30

Spring事物配置

2012-07-17 09:16:16

SpringSSH

2009-06-19 18:26:38

Spring事務(wù)配置

2021-05-06 07:58:57

Spring BeanIOCAOP
點(diǎn)贊
收藏

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

日韩国产欧美在线观看| 精品淫伦v久久水蜜桃| 国产精品久久久久一区| 99精品国产高清在线观看| 中文在线观看免费网站| 成人三级视频| 精品国产精品网麻豆系列| 99精品视频播放| 国产精品实拍| 久久综合九色综合久久久精品综合| 国产精品手机播放| 日韩免费av片| 999成人网| 日韩精品视频在线播放| 国产美女视频免费看| 成人欧美大片| 亚洲大型综合色站| 亚洲一区二区三区精品动漫| 天天干天天舔天天射| 精彩视频一区二区| 国产精品va在线| 日韩黄色三级视频| 亚洲色图网站| 亚洲午夜久久久久久久| 久久久老熟女一区二区三区91| 99久久综合国产精品二区| 精品毛片网大全| 青青草免费在线视频观看| 狠狠v欧美ⅴ日韩v亚洲v大胸| 成人av在线影院| 91老司机在线| 亚洲天堂avav| 天堂久久一区二区三区| 国内精品视频久久| 欧美成人免费观看视频| 国产精品福利在线观看播放| 国产午夜精品视频| 日本高清www| 日本中文字幕在线一区| 欧美第一区第二区| 成人一区二区三区仙踪林| 四虎成人精品一区二区免费网站| 99reav在线| 欧美激情91| 精品国产一区二区在线| 美国黄色特级片| 国产精品日韩精品中文字幕| 亚洲精品综合精品自拍| 午夜视频在线观看国产| 中文字幕区一区二区三| 日韩一区二区免费电影| 一级 黄 色 片一| 成人综合日日夜夜| 制服丝袜国产精品| 日韩欧美色视频| 国产欧美视频在线| 日韩三级视频中文字幕| 三级黄色片免费看| 97色婷婷成人综合在线观看| 欧美日本韩国一区| 日本美女视频一区| 欧美影院在线| 亚洲丁香久久久| 在线免费观看a级片| 日本一道高清一区二区三区| 亚洲人成电影网站色www| 99久久人妻无码精品系列| 妖精一区二区三区精品视频| 亚洲欧美自拍一区| 亚洲精品视频网址| 99re66热这里只有精品8| 俺去了亚洲欧美日韩| 加勒比婷婷色综合久久| 欧美久久久久| 45www国产精品网站| 亚洲成人av影片| 男女性色大片免费观看一区二区| 91麻豆桃色免费看| 黄色一级a毛片| 国产亚洲一本大道中文在线| 一本一道久久久a久久久精品91| 黄色免费网站在线观看| 亚洲3atv精品一区二区三区| 东京热加勒比无码少妇| 曰本一区二区| 亚洲国产日韩欧美在线99| 一卡二卡三卡四卡| 婷婷亚洲五月| 91精品国产高清| 在线视频欧美亚洲| 处破女av一区二区| 日本三级中国三级99人妇网站| 毛片激情在线观看| 午夜精品福利在线| 亚洲第一狼人区| 国产精品视频一区视频二区| 亚洲精品91美女久久久久久久| 日本少妇高潮喷水xxxxxxx| 欧美中文字幕一区二区| 欧美激情国产精品| 小泽玛利亚一区二区三区视频| 国内欧美视频一区二区| 精品综合久久久| 麻豆系列在线观看| 黄色精品一区二区| 日本精品一区在线| 亚洲精品国模| 欧美成人免费全部| 精品一区二三区| 成人黄页毛片网站| 中文字幕一区二区三区5566| 成入视频在线观看| 日韩一区二区三区电影在线观看| 欧美激情aaa| 亚洲香蕉网站| 国产欧美日韩精品专区| 肉丝一区二区| 亚洲在线成人精品| 五月天开心婷婷| 国产成人黄色| 97香蕉久久超级碰碰高清版| 99热这里只有精品在线| 国产精品水嫩水嫩| 国产欧美在线一区| 国产成人澳门| 九九精品视频在线观看| 中文字幕视频一区二区| 久久综合成人精品亚洲另类欧美| 欧美高清中文字幕| 秋霞一区二区三区| 久久九九全国免费精品观看| 免费在线不卡av| 国产欧美视频一区二区| 狠狠97人人婷婷五月| 动漫3d精品一区二区三区乱码| 美女av一区二区三区| 91精品国产色综合久久不8| 国产欧美日韩精品a在线观看| 国产视频一视频二| 好吊妞视频这里有精品| 久久99久久亚洲国产| 99精品免费观看| 亚洲欧洲精品天堂一级| 九九九九九九九九| 日韩免费看片| 国产精品自拍小视频| av在线电影免费观看| 91成人网在线| 欧美一区二区三区粗大| 蜜桃久久久久久| 伊人精品久久久久7777| 亚洲青青久久| 日韩在线观看免费高清完整版| 中文字幕视频二区| 中文字幕亚洲欧美在线不卡| 五月六月丁香婷婷| 午夜视频一区| 好吊妞www.84com只有这里才有精品| 麻豆av在线免费观看| 精品久久国产97色综合| 日本学生初尝黑人巨免费视频| 成人性生交大片免费| 国产在线播放观看| 日韩影视高清在线观看| 欧亚精品在线观看| gogogo高清在线观看免费完整版| 欧美午夜一区二区三区免费大片| 国产精品69久久久久孕妇欧美| 久久国产精品一区二区| 国产女主播av| 麻豆精品少妇| 国产精品黄色av| 黄色动漫在线| 亚洲精品久久久久久久久| 一级片免费在线播放| 中文字幕 久热精品 视频在线| 鲁一鲁一鲁一鲁一av| 欧美一区免费| 久久国产精品亚洲va麻豆| 丝袜美腿一区| 久久视频在线播放| 免费看日韩av| 欧美丝袜丝交足nylons图片| 男女性高潮免费网站| 99久久久久久| 艹b视频在线观看| 欧美黄色aaaa| 欧美日韩国产精品一区二区| 日本中文字幕视频一区| 欧美精品videos| 国产高清在线| 日韩精品一区二区三区视频在线观看 | 久久综合色综合| 久久综合九色综合久久久精品综合| 亚洲欧美自偷自拍另类| 9色精品在线| 中文网丁香综合网| 丝袜久久网站| 91免费高清视频| 亚洲国产成人二区| 欧美大片大片在线播放| 成人精品一区二区三区免费 | 欧美1级日本1级| 欧美精品一区二区三区在线看午夜 | 亚洲黄色视屏| 亚洲精品日韩精品| 少妇久久久久| 香蕉亚洲视频| 91老司机在线| 亚洲四虎影院| 91精品国产免费久久久久久| 久久黄色美女电影| 亚洲欧美一区二区三区四区| 性一交一乱一乱一视频| 欧美性生活一区| 成人毛片18女人毛片| 亚洲精品久久7777| youjizz亚洲女人| 久久久亚洲高清| 制服丝袜在线第一页| 国产一区二区三区四区五区入口| 91av俱乐部| 国产精品视频| 亚洲 欧美 日韩 国产综合 在线| 欧美在线高清| 中文字幕色一区二区| 成人高清电影网站| 免费成人看片网址| 欧美变态网站| 国产综合动作在线观看| 91精品尤物| 亚洲xxxxx| 国产一区二区久久久久| 成人免费黄色网| 日韩电影精品| 国产狼人综合免费视频| 成人午夜一级| 国产精品久久中文| 日本一区二区三区视频在线| 日本精品久久久久久久| 在线天堂资源www在线污| 7777免费精品视频| 三级中文字幕在线观看| 91精品国产91久久久久久| 99爱在线观看| 97婷婷涩涩精品一区| 麻豆成全视频免费观看在线看| 久久久久久97| 精品极品在线| 人体精品一二三区| 写真福利精品福利在线观看| 国产精品美女久久| 亚洲电影有码| 成人国产精品一区| 国产精品麻豆| 日韩有码一区二区三区| 相泽南亚洲一区二区在线播放| 国产日产精品一区二区三区四区的观看方式 | 久久精品国产成人av| 福利视频一区二区| 日日摸天天添天天添破| 在线一区二区三区| 中文字幕免费观看视频| 91精品国产综合久久精品| www.黄色一片| 亚洲韩国欧洲国产日产av| 日韩精品系列| 色av吧综合网| 在线中文字幕电影| 26uuu国产精品视频| 欧美电影免费观看网站| 国产美女被下药99| 国产美女视频一区二区| 国产精品一国产精品最新章节| 电影一区二区在线观看| 欧美日韩另类综合| 亚洲一级淫片| 少妇高潮喷水在线观看| 日韩高清在线观看| 日本中文字幕在线不卡| 97久久超碰国产精品电影| 欧美午夜激情影院| 亚洲综合色区另类av| 中文字幕视频网站| 91精品国产一区二区三区蜜臀| 日本高清视频网站| 在线不卡国产精品| 男女在线观看视频| 国产精品成人免费视频| 深夜福利一区二区三区| 欧美一级二级三级九九九| 一区二区中文| 日本成人中文字幕在线| 国产一区二区伦理片| 性欧美13一14内谢| 曰韩精品一区二区| 波多野结衣网站| 精品久久久久久久久久久久久久久久久| 国产人成在线观看| 欧美极品美女视频网站在线观看免费 | 中文字幕一区三区| 中文字幕视频网站| 日韩欧美国产综合| 91在线高清| 国产91精品视频在线观看| 久久精品九色| 视频一区二区三区免费观看| 亚洲国产精品第一区二区| 午夜精品中文字幕| 久久精品男人天堂av| 国产精品99精品无码视| 欧美高清一级片在线| 国产玉足榨精视频在线观看| 久久久久久欧美| 欧美片网站免费| 亚洲成人av动漫| 欧美一级久久| 中文字幕在线播放一区| 亚洲精品国产无套在线观| 中文字幕在线观看免费| 亚洲美女又黄又爽在线观看| 91福利在线尤物| 成人网中文字幕| 天天揉久久久久亚洲精品| 久久久久久香蕉| 2020国产精品久久精品美国| 免费毛片一区二区三区| 欧美电影免费观看完整版| 国产视频中文字幕在线观看| 国产精品午夜一区二区欲梦| 视频一区欧美| 成人黄色片视频| 91丨porny丨在线| 丁香六月婷婷综合| 精品一区二区三区四区| 毛片电影在线| 精品视频一区二区| 亚洲三级影院| 最近中文字幕无免费| 五月激情综合网| 污污视频在线观看网站| 91精品成人久久| 在线一级成人| 成人性视频欧美一区二区三区| 国产亚洲短视频| 国产偷人爽久久久久久老妇app| 国产亚洲人成网站在线观看| 日韩欧美一区二区三区免费观看 | 亚洲精品婷婷| 精品少妇人妻av一区二区三区| 亚洲线精品一区二区三区| 成人久久精品人妻一区二区三区| 久久99久久亚洲国产| 国产精品17p| 国产精品无码av在线播放| 久久久午夜精品理论片中文字幕| 国产一区二区视频免费| 在线视频欧美日韩精品| 日韩黄色三级在线观看| 波多野结衣三级在线| 懂色一区二区三区免费观看| 国产在线视频你懂的| 亚洲精品久久久久中文字幕欢迎你 | 看女生喷水的网站在线观看| 91精品视频免费观看| 欧美黄色一级视频| 国产精品久久不卡| 在线视频一区二区免费| 在线免费观看黄| 91嫩草视频在线观看| 99视频一区| 国产sm调教视频| 欧美一区二区三区四区在线观看| 成全电影大全在线观看| 欧美成人免费在线| 精品一区二区三区久久久| 精品在线视频观看| 亚洲欧美另类在线观看| 日韩三级一区| 免费看毛片的网址| 国产欧美日韩另类一区| 不卡视频在线播放| 国产91色在线|| 一区二区影视| 成人在线一级片| 欧美一区二区高清| 亚洲小少妇裸体bbw| 最新欧美日韩亚洲| av午夜一区麻豆| 亚洲天堂999| 2019精品视频| 天天综合一区| 蜜桃精品成人影片| 51午夜精品国产| 亚洲精品mv| 国产成人永久免费视频| 国产女同性恋一区二区| 人妻一区二区三区| 91免费看国产| 肉丝袜脚交视频一区二区|