前言
三級緩存的含義及背景請自行百度
問1:為什么會有二級緩存?
使用1級和3級也能解決循環(huán)依賴問題券膀,但是:如果一個對象被依賴兩次以上(a引b适瓦,b引c和a,c引a焙畔,abc均使用了aop)掸读,此時如果只用1和3級緩存就存在以下問題:
b中拿到三級緩存的工廠調(diào)用getObject()創(chuàng)建a的代理對象,c中也會拿到三級緩存的工廠調(diào)用getObject()創(chuàng)建a的代理對象宏多,由于getObject()每次創(chuàng)建的代理對象不同儿惫,就違反了單例原則。如果存在第二級緩存绷落,b拿到緩存工廠創(chuàng)建a的代理對象后姥闪,后續(xù)會放到二級緩存,而c只需要從二級緩存中直接就可以拿到a的同一個代理對象砌烁。
問2:為什么會有三級緩存筐喳?
使用1級和2級緩存也能解決循環(huán)依賴問題,但是使用AOP時也會有以下問題:
a引b函喉,b引a避归,a進(jìn)二級緩存;然后初始化b管呵,b使用a暴露的對象(二級緩存)梳毙,b初始化完畢封裝成代理對象;繼續(xù)初始化a捐下,a完成账锹。此時萌业,a中引用的是代理后的b,而b中引用的是原始對象a奸柬。這個時候生年,對a對象使用aop就會出現(xiàn)問題。