循環(huán)依賴問(wèn)題一個(gè)bean的創(chuàng)建分為如下步驟: 當(dāng)創(chuàng)建一個(gè)簡(jiǎn)單對(duì)象的時(shí)候,過(guò)程如下:
當(dāng)創(chuàng)建一個(gè)對(duì)象并且其中有另外一個(gè)對(duì)象是就變成了這樣: 但是當(dāng)在B對(duì)象中由引用了A對(duì)象,就會(huì)變成這樣: 因?yàn)锳和B兩者相互引用,但是單例池中始終無(wú)法創(chuàng)建任一對(duì)象,所以會(huì)出現(xiàn)死循環(huán)。 因此,我們需要添加一個(gè)半成品池,先把A初始化出來(lái),放到一個(gè)半成品池中。 過(guò)程如下:
這樣就解決了死循環(huán)創(chuàng)建但是當(dāng)使用了動(dòng)態(tài)代理后,情況又會(huì)有所變化. 先來(lái)看一下AOP的執(zhí)行過(guò)程,如圖: 在bean的創(chuàng)建過(guò)程中,創(chuàng)建動(dòng)態(tài)代理的時(shí)機(jī)是在初始化之后的,如圖: 這個(gè)時(shí)候半成品池里放的是沒(méi)有代理過(guò)的A對(duì)象,當(dāng)B去半成品池中獲取A對(duì)象,獲取的是動(dòng)態(tài)代理前的A對(duì)象,而我們應(yīng)該獲取的是動(dòng)態(tài)代理后的A對(duì)象,這就會(huì)出現(xiàn)問(wèn)題. 為了解決AOP的問(wèn)題,spring又加入了一個(gè)工廠池 執(zhí)行過(guò)程如下:
|
|