項目場景:
提示:這里簡述項目相關(guān)背景:
例如:項目場景:示例:通過藍(lán)牙芯片(HC-05)與手機 APP 通信,每隔 5s 傳輸一批傳感器數(shù)據(jù)(不是很大)
問題描述
????????我們都知道,如果在代碼中,將兩個或多個 Bean 互相之間持有對方的引用就會發(fā)生循環(huán)依賴。循環(huán)的依賴將會導(dǎo)致注入死循環(huán),這是 Spring 發(fā)生循環(huán)依賴的原因。
????????循環(huán)依賴有三種形態(tài):
????????????????第一種,互相依賴:A 依賴 B,B 又依賴 A,它們之間形成了循環(huán)依賴。
?????????????????第二種,三者間依賴:A 依賴 B,B 依賴 C,C 又依賴 A,形成了循環(huán)依賴。
?
????????????????第三種,自我依賴:A 依賴 A 形成了循環(huán)依賴。
? ? ? ? ? ? ? ? ? ?
問題解決:
????????Spring 中設(shè)計了三級緩存來解決循環(huán)依賴問題,當(dāng)我們?nèi)フ{(diào)用 getBean()方法的時候,Spring 會先從一級緩存中去找到目標(biāo) Bean,如果發(fā)現(xiàn)一級緩存中沒有便會去二級緩存中去找,而如果一、二級緩存中都沒有找到,意味著該目標(biāo) Bean 還沒有實例化。
????????于是,Spring 容器會實例化目標(biāo) Bean(PS:剛初始化的 Bean 稱為早期 Bean) 。然 后,將目標(biāo) Bean 放入到二級緩存中,同時,加上標(biāo)記是否存在循環(huán)依賴。如果不存在循環(huán)依賴,便會將目標(biāo) Bean 存入到二級緩存,否則,便會標(biāo)記該 Bean 存在循環(huán)依賴, 然后將等待下一次輪詢賦值,也就是解析@Autowired 注解。等@Autowired 注解賦值完成后(PS:完成賦值的 Bean 稱為成熟 Bean) ,會將目標(biāo) Bean 存入到一級緩存。
????????這里可以做個總結(jié),我們來看這張圖。Spring 一級緩存中存放所有的成熟 Bean, 二級緩存中存放所有的早期 Bean,先取一級緩存,再去二級緩存。?
?
問題擴(kuò)展
? ? ? ? 那么,前面有提到三級緩存,三級緩存的作用是什么?
????????回答:三級緩存是用來存儲代理 Bean,當(dāng)調(diào)用 getBean()方法時,發(fā)現(xiàn)目標(biāo) Bean 需要通過代理工廠來創(chuàng)建,此時會將創(chuàng)建好的實例保存到三級緩存,最終也會將賦值好的 Bean 同步到一級緩存中。
????????Spring 中哪些情況下,不能解決循環(huán)依賴問題?
?????????1、多例 Bean 通過 setter 注入的情況,不能解決循環(huán)依賴問題
? ? ? ? ?2、構(gòu)造器注入的 Bean 的情況,不能解決循環(huán)依賴問題
? ? ? ? ?3、單例的代理 Bean 通過 Setter 注入的情況,不能解決循環(huán)依賴問題文章來源:http://www.zghlxwxcb.cn/news/detail-642033.html
? ? ? ? ?4、設(shè)置了@DependsOn 的 Bean 的情況,不能解決循環(huán)依賴問題文章來源地址http://www.zghlxwxcb.cn/news/detail-642033.html
到了這里,關(guān)于Spring 是如何解決循環(huán)依賴問題的?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!