<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
所謂的三級快取只是三個可以當作是全域性變數的Map,Spring的原始碼中大量使用了這種先將資料放入容器中等使用結束再銷燬的程式碼風格
Spring的初始化過程大致有四步:
我們說的迴圈依賴就是第四步在給Bean屬性注入的時候發生的一個問題
迴圈依賴就是:
假設有兩個類 A和B,A中需要注入B,B中需要注入A
由於A注入B時B沒有建立,B建立時A也無法建立導致的死迴圈問題
我們都知道AOP是Spring的一個重要核心思想,其實現就是根據動態代理來實現的,也就是說我們的Bean其實很大概率都是要生成代理類,讓我們先來看無代理的情況:
Bean的初始化大概是這樣的:
根據以上步驟可以看出bean初始化是一個相當複雜的過程,假如初始化A bean時,發現A bean依賴B bean,即A初始化執行到了第4步填充屬性,需要注入B bean,此時B還沒有初始化,則需要暫停A,先去初始化B,那麼此時new出來的A物件放哪裡,直接放在容器Map裡顯然不合適,半殘品怎麼能用,所以需要提供一個可以標記建立中bean(A)的Map,可以提前暴露正在建立的bean供其他bean依賴,而如果初始化A所依賴的bean B時,發現B也需要注入一個A的依賴(即發生迴圈依賴),則B可以從建立中的beanMap中直接獲取A物件(建立中)注入A,然後完成B的初始化,返回給正在注入屬性的A,最終A也完成初始化,皆大歡喜。
如果沒有迴圈依賴,A 依賴B,就是建立B,B依賴C就去建立C,建立完了逐級返回就行,並不需要什麼快取,所以,一級快取之後的其他快取(二三級快取)就是為了解決迴圈依賴而設立的
一級快取其實就是我們的成熟的Bean了,可以直接被使用
我們去看一下原始碼:
從原始碼中我們可以看到,三級快取裡放的並不是範例化的Bean,而是一個工廠,這是為什麼呢?
迴圈依賴在實際應用可能會有,但很少,簡單的應用場景是: controller注入service,service注入mapper,只有複雜的業務,可能service互相參照,有可能出現迴圈依賴,所以為了出現迴圈依賴才去解決,不出現就不解決,雖然支援迴圈依賴,但是只有在出現迴圈依賴時才真正暴露早期物件,否則只暴露個獲取bean的方法,並沒有真正暴露bean,因為這個方法不會被執行到,這塊的實現就是三級快取(singletonFactories),只快取了一個單例bean工廠。
為什麼是一個工廠?或者說這個工廠的作用?
三級快取bean工廠的getObject方式,實際執行的是getEarlyBeanReference,如果物件需要被代理(存在beanPostProcessors -> SmartInstantiationAwareBeanPostProcessor),則提前生成代理物件。
三級快取已經解決所有問題了,二級快取用來做什麼呢?為什麼三級快取不直接叫做二級快取?這個應該是在快取使用時決定的:
此時這個方法中的判斷邏輯是:
那麼為什麼要把物件從三級快取放到二級快取呢?
給大家一個迴圈依賴的流程圖,大家一看便知:
看到了嗎,如果AB都需要代理,我們在A的屬性注入時建立了B,但是此時A還是原生的A,但是我們需要代理A,而代理A在B注入A時已經建立並放入二級快取中了,我們直接從二級快取拿然後替換原生A即可。
所以,我理解的是二級快取是為了應對代理這個情況而生的
至此,迴圈依賴的問題已經完美解決
建構函式迴圈依賴:
如果我們的成員屬性是在建構函式裡呢?
首先要解決迴圈依賴就是要先範例化,然後放入三級快取暴露出來,那麼如果是建構函式這一步迴圈依賴,
範例化的時候就會產生無限遞迴建立,所以不能解決
多例的迴圈依賴:
如果是多例的,在容器初始化的時候,不會去建立,所以早期沒有放入到三級快取中暴露出來,所以無法解決迴圈依賴,會報錯
到此這篇關於Spring解決迴圈依賴問題及三級快取的作用的文章就介紹到這了,更多相關Spring解決迴圈依賴問題內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45