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

日韩国产福利| 可以看毛片的网址| 在线观看av大片| 久久久影院免费| 欧美午夜宅男影院| 偷拍盗摄高潮叫床对白清晰| 伊人网视频在线| 在线国产一区二区| 亚洲国产精品推荐| 中文字幕av不卡在线| 性欧美video高清bbw| 99国产精品久| 国产精品久久久久久搜索| 欧美成人短视频| 久久一级大片| 色综合久久天天| 亚洲看片网站| 国产成年人在线观看| 中文视频在线观看| 78精品国产综合久久香蕉| 亚洲精品自拍动漫在线| 国产chinese精品一区二区| 亚洲大片免费观看| 国内激情久久| 精品国产自在精品国产浪潮| 一区二区不卡免费视频| 国产成年精品| 欧美色窝79yyyycom| 国产96在线 | 亚洲| 黄色网页在线看| 99久久久精品免费观看国产蜜| 国产成人亚洲综合91精品| 欧美爱爱小视频| 久久裸体网站| 亚洲午夜精品久久久久久久久久久久| 成人做爰www看视频软件 | 欧美成年人在线观看| 亚洲激情 欧美| av日韩一区| 欧美日韩国产精品| 久久这里只有精品8| 日本最黄一级片免费在线| 久久久久久久电影| 国产一区二区在线网站| 黄色www视频| 老鸭窝91久久精品色噜噜导演| 欧美激情网友自拍| 在线观看成人毛片| 91精品久久久久久久蜜月 | 成人福利片网站| 国产精品久久久久永久免费观看| 国产呦系列欧美呦日韩呦| 国产黄色片网站| 美女网站色91| 国产精品美女主播| 日本网站免费观看| 99成人超碰| 欧美r级电影| 亚洲综合图片区| 国产免费xxx| 91官网在线| 国产精品视频一区二区三区不卡| 久久久久久久久久久久久久久久av| 黑人精品一区二区三区| 精品综合免费视频观看| 国产精品日韩在线一区| 欧美激情黑白配| 久久综合九色综合欧美狠狠| 日本久久久久亚洲中字幕| 国产美女激情视频| 首页国产欧美日韩丝袜| 国产欧美日韩最新| 麻豆精品久久久久久久99蜜桃| 久久久久一区| 国产女人18毛片水18精品| 亚洲熟妇无码久久精品| 国内成人精品2018免费看| www日韩av| 国产普通话bbwbbwbbw| 国产白丝精品91爽爽久久| 国产成人精品日本亚洲11| 午夜视频www| 国产成人精品三级| 国精产品99永久一区一区| 黄色小视频免费观看| 99re热视频这里只精品| 天堂一区二区三区| 久久久久久久久免费视频| 亚洲精品写真福利| 欧美一级免费播放| av综合电影网站| 欧美福利电影网| 野战少妇38p| 九九精品久久| 中文国产成人精品| 9.1成人看片| 97欧美在线视频| 久久久久久久久久久人体| 国产精品成人av久久| 国产精品日本欧美一区二区三区| 国产精品一品视频| 97欧美精品一区二区三区| www五月天com| 日韩电影免费在线观看网站| 亚洲最大的成人网| 久草福利在线视频| 一区二区三区四区在线免费观看| 麻豆md0077饥渴少妇| 在线观看wwwxxxx| 欧美午夜精品久久久久久浪潮 | 日韩电影大全网站| 日韩一区二区免费视频| 麻豆精品免费视频| 黄色av日韩| 成人h片在线播放免费网站| 亚洲精品国产精品乱码视色| www.亚洲在线| 五月天丁香综合久久国产| av免费不卡国产观看| 欧美一区午夜视频在线观看| 日本wwwwwww| 成人在线免费观看91| 美女精品视频一区| 丰满熟女人妻一区二区三| 丰满放荡岳乱妇91ww| 中文字幕不卡每日更新1区2区| 色一区二区三区| 欧美成人女星排行榜| а天堂中文在线资源| 国产一级久久| 国产精品国产亚洲精品看不卡15| 欧美日韩xx| 在线看日本不卡| 人体私拍套图hdxxxx| 欧美日韩91| 国产精品第二页| 免费在线一级视频| 亚洲第一主播视频| 9191在线视频| 九九热精品视频在线| 日韩片欧美片| 国产精品pans私拍| 人成在线免费视频| 午夜视频在线观看一区二区三区| 伊人av在线播放| 在线电影一区二区| 亚洲一区二区三区xxx视频| 韩国三级av在线免费观看| 亚洲va天堂va国产va久| 少妇献身老头系列| 最新国产精品| 99精品国产高清一区二区| av免费看在线| 欧美精品99久久久**| 亚洲国产123| 久久精品国产秦先生| 一本一生久久a久久精品综合蜜| 性欧美18xxxhd| 亚洲欧洲国产精品| 岛国av中文字幕| 久久精品一区二区三区不卡牛牛 | 日本乱理伦在线| 精品久久人人做人人爽| 精品一区免费观看| 91丝袜国产在线播放| 欧美 日韩 亚洲 一区| 91精品国产自产在线丝袜啪 | 一区二区精品在线| yiren22亚洲综合| 在线日韩中文字幕| 一本色道久久综合熟妇| 亚洲欧洲国产专区| 精品国产一二区| 国产精品久久久久毛片大屁完整版| 噜噜噜噜噜久久久久久91| 三上悠亚激情av一区二区三区| 日韩精品亚洲精品| 中文字幕日韩三级| 亚洲精品午夜久久久| 无码国产精品一区二区免费式直播 | 国产jzjzjz丝袜老师水多| 亚洲另类中文字| 理论片大全免费理伦片| 日韩综合在线视频| 国产手机视频在线观看| 99a精品视频在线观看| 91精品国产91久久久| 免费a级片在线观看| 色嗨嗨av一区二区三区| 欧美性x x x| av一区二区三区四区| 欧美 日韩 国产在线观看| 女厕嘘嘘一区二区在线播放| 91久久久精品| 校园春色亚洲| 久久综合色影院| 日韩精品福利| 91精品国产综合久久香蕉麻豆| 好吊操这里只有精品| 中文字幕一区免费在线观看| 污污污www精品国产网站| 天堂成人国产精品一区| 成人午夜免费剧场| 国产亚洲一区| 91亚洲精品视频| 综合日韩av| 久久色在线播放| 日韩一卡二卡在线| 色综合夜色一区| 日韩女优一区二区| 91麻豆免费看片| 中文字幕成人精品久久不卡| 中文在线a天堂| 亚洲18色成人| 久草手机视频在线观看| 久久影音资源网| 在线播放第一页| 免费人成在线不卡| 国产超级av在线| 黄色av日韩| 一道本在线观看视频| 欧美三级电影在线| 51国偷自产一区二区三区| 国产精品.xx视频.xxtv| 欧美亚洲另类视频| 性欧美videoshd高清| 日日狠狠久久偷偷四色综合免费 | 91麻豆精品久久久久蜜臀| 国产网站在线看| 一级女性全黄久久生活片免费| 又嫩又硬又黄又爽的视频| 国产视频一区二区在线| 久久人人爽人人爽人人片| va亚洲va日韩不卡在线观看| 在线观看一区二区三区视频| 极品美女销魂一区二区三区| 国产精品视频分类| 日韩极品在线观看| 中国丰满人妻videoshd| 亚洲精品字幕| 97超碰在线人人| 欧美~级网站不卡| 精品电影一区二区| 久久久久免费精品| 亚洲美女黄色| 欧美三级午夜理伦三级老人| 欧美天天综合| 欧洲久久久久久| 国产一区二区精品久| 精品久久蜜桃| 久久影院资源站| 国产激情一区二区三区在线观看| 123成人网| 国产精品视频一区二区三区四| 成人亚洲网站| 91精品综合久久久久久五月天| 色8久久久久| 国产精品入口日韩视频大尺度| 黄色成人小视频| 91久久在线播放| 精品国产亚洲一区二区三区大结局| 96sao精品视频在线观看| 国产激情精品一区二区三区| 91久久久久久久| 成人中文字幕视频| 免费国产一区| 久久中文字幕av一区二区不卡| 在线观看视频黄色| 欧美一区三区| 亚洲综合五月天| 亚洲先锋影音| 国产一区二区视频播放| 午夜亚洲视频| 成年人小视频网站| 久久精品国产免费看久久精品| 免费看三级黄色片| 国内一区二区在线| 先锋资源av在线| 国产无一区二区| 日韩欧美综合视频| 久久一夜天堂av一区二区三区| 亚洲这里只有精品| 日韩二区三区在线观看| 欧美日韩精品区别| 日本欧美一区二区三区乱码| 6080国产精品| 91理论电影在线观看| a天堂中文字幕| 国产精品久久久久aaaa樱花| 久久久久久久久艹| 欧美日韩福利| 国产专区一区二区三区| av成人男女| 日韩欧美一区二区三区四区| 一区二区不卡| 国产一区视频免费观看| 国产伦精品一区二区三区免费| 麻豆传媒在线看| 久久综合九色综合97婷婷| 中文字幕乱码av| 尤物在线观看一区| 久久人人爽人人爽人人| 欧美日韩在线看| 中文人妻熟女乱又乱精品| 亚洲成人黄色在线| 97视频在线观看网站| 欧美激情亚洲一区| 欧美jizz18| 蜜桃在线一区二区三区精品| 欧美日韩p片| 九一精品久久久| 91视频免费观看| 欧美风情第一页| 一本一道波多野结衣一区二区| 成人免费公开视频| 一区二区三区在线播放欧美| 欧美aa在线| www日韩av| 在线中文字幕第一区| 人人爽人人av| www..com久久爱| 久久亚洲av午夜福利精品一区| 欧美日韩成人激情| 九色在线播放| 欧美性在线观看| 福利片在线一区二区| 亚洲一区在线直播| 日产国产欧美视频一区精品| 丰满少妇中文字幕| 亚洲欧美激情小说另类| 在线观看av大片| 国产一区二区三区精品久久久 | 秋霞av鲁丝片一区二区| 久久中文精品视频| 91精品一区| 99热一区二区三区| 另类人妖一区二区av| 久久久久久久久久久久久久久| 狠狠色狠狠色综合日日五| 国产99久久九九精品无码免费| 这里只有精品在线播放| 97欧美成人| 亚洲一区二区高清视频| 男人的天堂亚洲一区| 国产精品毛片一区二区| 色国产综合视频| jizz在线免费观看| 国产精品成av人在线视午夜片| 欧美电影免费网站| 131美女爱做视频| 91麻豆蜜桃一区二区三区| 三级视频在线观看| 裸体一区二区| 国产v亚洲v天堂无码久久久 | 国产熟妇搡bbbb搡bbbb| 精品久久久久久中文字幕| 天天在线女人的天堂视频| 美日韩精品免费视频| 视频在线观看免费影院欧美meiju 视频一区中文字幕精品 | 国产精品久久久久久久裸模| 中文天堂在线资源| 色老头一区二区三区在线观看| 日韩精品99| 亚洲精品久久区二区三区蜜桃臀| 精品综合久久久久久8888| 在线免费观看亚洲视频| 精品免费国产一区二区三区四区| 欧美男男video| 蜜桃在线一区二区三区精品| 奇米精品一区二区三区在线观看| 香蕉久久久久久久| 91精品国产综合久久香蕉麻豆| 国产一线二线在线观看| 99久久一区三区四区免费| 亚洲精品影视| 我想看黄色大片| 欧美日韩亚洲综合在线 | 欧美性资源免费| 精品国产中文字幕第一页| 九九九九九国产| 亚洲mv在线观看| 成人精品一区二区三区免费 | 日韩中文综合网| 日韩高清一区| av动漫免费看| 亚洲美女免费视频| 天堂在线观看视频| 国产美女直播视频一区| 亚洲午夜极品| 四虎成人免费影院| 欧美一区二区三区视频免费播放| 羞羞视频在线免费国产| 欧美激情论坛| 国产成人自拍在线| 伊人久久久久久久久久久久| 亚洲欧美中文日韩在线| 涩涩屋成人免费视频软件| 无码人妻精品一区二区三区66| 国产精品久久久久久久浪潮网站| 老熟妇高潮一区二区高清视频|