前言
三級緩存的含義及背景請自行百度
問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進二級緩存;然后初始化b,b使用a暴露的對象(二級緩存),b初始化完畢封裝成代理對象;繼續(xù)初始化a,a完成。此時,a中引用的是代理后的b,而b中引用的是原始對象a。這個時候,對a對象使用aop就會出現(xiàn)問題。