什么是循環(huán)依賴
循環(huán)依賴就是兩個(gè)對(duì)象之間存在相互依賴的關(guān)系;
Spring是如何解決循環(huán)依賴的
Spring使用三級(jí)緩存來解決循環(huán)依賴
三級(jí)緩存如何解決循環(huán)依賴的
三級(jí)緩存是通過三個(gè)HashMap來實(shí)現(xiàn)的。
- 一級(jí)緩存,用于保存已完成初始化的Bean實(shí)例,對(duì)外暴露可用的實(shí)例;
- 二級(jí)緩存,保存尚未完成初始化的Bean實(shí)例,為了處理循環(huán)依賴的對(duì)象創(chuàng)建問題;
- 三級(jí)緩存,保存創(chuàng)建Bean實(shí)例的工廠類,處理存在 AOP + 循環(huán)依賴的對(duì)象創(chuàng)建問題,能將代理對(duì)象提前創(chuàng)建。
三級(jí)緩存解決循環(huán)依賴過程

循環(huán)依賴
Spring 為什么要引入第三級(jí)緩存?
Spring 的設(shè)計(jì)原則是盡可能保證普通對(duì)象創(chuàng)建完成之后,再生成其 AOP 代理(盡可能延遲代理對(duì)象的生成)所以 Spring 用了第三級(jí)緩存,既維持了設(shè)計(jì)原則,又處理了循環(huán)依賴。
只用二級(jí)緩存能不能解決循環(huán)依賴?
可以,但是在AOP對(duì)象發(fā)生循環(huán)依賴的時(shí)候會(huì)存在一些問題。
一級(jí)和二級(jí)緩存
如果只用一級(jí)緩存和二級(jí)緩存時(shí),在給Bean實(shí)例注入依賴時(shí)只能注入原始對(duì)象,而非提前創(chuàng)建的代理對(duì)象。因?yàn)閷傩再x值階段完成之后,在Bean初始化階段才會(huì)生成代理對(duì)象。
一級(jí)和三級(jí)緩存
如果只用一級(jí)緩存和三級(jí)緩存時(shí),在每次獲取依賴Bean實(shí)例的時(shí)候,都會(huì)通過ObjectFactory創(chuàng)建新的實(shí)例,違背Spring設(shè)計(jì)原則。