日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

spring解決循環依賴的簡單方法

瀏覽:226日期:2023-08-13 16:19:27

Spring內部如何解決循環依賴,一定是單默認的單例Bean中,屬性互相引用的場景。比如幾個Bean之間的互相引用:

spring解決循環依賴的簡單方法

或者

spring解決循環依賴的簡單方法

setter方式原型,prototype

原型(Prototype)的場景是不支持循環依賴的,因為“prototype”作用域的Bean,為每一個bean請求提供一個實例,Spring容器不進行緩存,因此無法提前暴露一個創建中的Bean,會拋出異常。

構造器參數循環依賴

Spring容器會將每一個正在創建的Bean 標識符放在一個“當前創建Bean池”中,Bean標識符在創建過程中將一直保持在這個池中。

因此如果在創建Bean過程中發現自己已經在“當前創建Bean池”里時將拋出BeanCurrentlyInCreationException異常表示循環依賴;而對于創建完畢的Bean將從“當前創建Bean池”中清除掉。

Spring容器先創建單例A,A依賴B,然后將A放在“當前創建Bean池”中,此時創建B,B依賴C,然后將B放在“當前創建Bean池”中,此時創建C,C又依賴A, 但是,此時A已經在池中,所以會報錯,,因為在池中的Bean都是未初始化完的,所以會依賴錯誤 ,(初始化完的Bean會從池中移除)。

setter方式單例,默認方式

那么默認單例的屬性注入場景,Spring是如何支持循環依賴的?

既然,要解決循環依賴,那肯定存在著依賴,我們假設有兩個類:

A和B,A->B,B->A,且二者是通過@Autowired相互注入的。

我們假設從A開始創建,那就是先創建A對象,然后創建B對象,再通過反射把B對象set到A對象的屬性上去(fieldB.set(a, b)),在創建B的時候發現它又依賴于A,這時候同樣地,我要尋找一個A對象set到B的屬性上去,但是我們的系統中只能存在一個A對象(單例)。

為了解決這個問題,需要再前面創建A對象的時候就把它保存起來?我們假設保存在緩存中,后面B對象要使用的時候先去緩存中查找一下不就OK了嘛?!

所以,解決循環依賴的方法就是保存所有創建的對象,后面創建對象的時候有依賴的情況先去緩存中找一下,找到了直接set到那個正在創建的對象的屬性上,沒找到就創建一個新的對象給那個正在創建的對象,并保存到緩存中。

實際上,Spring中也是這么干的,只不過它的緩存不只一個,而是有四個。

具體可以看下這邊文章。

https://www.jb51.net/article/195897.htm

Spring解決循環依賴

首先,Spring內部維護了三個Map,也就是我們通常說的三級緩存。

在Spring的DefaultSingletonBeanRegistry類中,類上方掛著這三個Map:

singletonObjects 它是我們最熟悉的朋友,俗稱“單例池”“容器”,緩存創建完成單例Bean的地方。 singletonFactories 映射創建Bean的原始工廠 earlySingletonObjects 映射Bean的早期引用,也就是說在這個Map里的Bean不是完整的,甚至還不能稱之為“Bean”,只是一個Instance.

后兩個Map其實是“墊腳石”級別的,只是創建Bean的時候,用來借助了一下,創建完成就清掉了。

為什么成為后兩個Map為墊腳石,假設最終放在singletonObjects的Bean是你想要的一杯“涼白開”。

那么Spring準備了兩個杯子,即singletonFactories和earlySingletonObjects來回“倒騰”幾番,把熱水晾成“涼白開”放到singletonObjects中

循環依賴的本質

定義兩個類A與B:

public class A { private B b; public B getB() { return b; } public void setB(B b) { this.b = b; }}

public class B { public A getA() { return a; } public void setA(A a) { this.a = a; } private A a;}

public class CircularDependency { private static Map<String, Object> cacheMap = new HashMap<>(2); public static void main(String[] args) throws Exception { // 假裝掃描出來的對象 Class[] classes = { A.class, B.class }; // 假裝項目初始化實例化所有bean for (Class aClass : classes) { getBean(aClass); } // check System.out.println(getBean(B.class).getA() == getBean(A.class)); System.out.println(getBean(A.class).getB() == getBean(B.class)); } private static <T> T getBean(Class<T> beanClass) throws Exception{ // 本文用類名小寫 簡單代替bean的命名規則 String beanName = beanClass.getSimpleName().toLowerCase(); // 如果已經是一個bean,則直接返回 if (cacheMap.containsKey(beanName)) { return (T) cacheMap.get(beanName); } // 將對象本身實例化 Object object = beanClass.getDeclaredConstructor().newInstance(); // 放入緩存 cacheMap.put(beanName, object); // 把所有字段當成需要注入的bean,創建并注入到當前bean中 Field[] fields = object.getClass().getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); // 獲取需要注入字段的class Class<?> fieldClass = field.getType(); String fieldBeanName = fieldClass.getSimpleName().toLowerCase(); // 如果需要注入的bean,已經在緩存Map中,那么把緩存Map中的值注入到該field即可 // 如果緩存沒有 繼續創建 field.set(object, cacheMap.containsKey(fieldBeanName) ? cacheMap.get(fieldBeanName) : getBean(fieldClass)); } // 屬性填充完成,返回 return (T) object; }}

這段代碼的效果,其實就是處理了循環依賴,并且處理完成后,cacheMap中放的就是完整的“Bean”了。

總結

到此這篇關于spring解決循環依賴的文章就介紹到這了,更多相關spring解決循環依賴內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
四虎成人精品一区二区免费网站| 免费在线亚洲欧美| 69堂精品视频在线播放| 久久国产高清| 精品日韩毛片| 欧美亚洲国产一区| 欧美亚洲在线日韩| 在线日韩视频| 国产成人1区| 高清精品久久| 日韩精品欧美| 免费av一区| 国产精品美女久久久浪潮软件| 亚洲性色视频| 久久av一区| 日韩视频一二区| 国产欧美视频在线| 精品久久影院| 日韩国产欧美| 国产福利片在线观看| 蜜臀av在线播放一区二区三区| 欧美日韩国产精品一区二区亚洲| 午夜国产精品视频| 激情综合网址| 亚洲综合精品四区| 亚洲丝袜啪啪| 国产精选久久| 日韩av福利| 国产午夜精品一区二区三区欧美| 中文字幕日韩高清在线 | 欧美日韩国产精品一区二区亚洲| 丝袜美腿亚洲色图| 日韩和欧美的一区| 久久久国产精品网站| 国产一区二区三区国产精品| 麻豆视频在线看| 日韩在线综合| 亚洲韩日在线| 麻豆国产91在线播放| 91精品一区二区三区综合在线爱| 精品久久中文| 色在线中文字幕| 蜜桃一区二区三区在线观看| 三上亚洲一区二区| 日韩三级一区| 天堂中文av在线资源库| 国产欧美一区二区三区精品观看| 免费人成精品欧美精品| 欧美在线91| 日本欧美韩国一区三区| 石原莉奈在线亚洲二区| av一区二区高清| 国产精品调教| 成人av二区| 日韩久久电影| 久久午夜影院| 99久久精品网| 日av在线不卡| 日本久久二区| 亚洲福利国产| 蜜桃av一区二区在线观看| 国产精品一区三区在线观看| 亚洲精品1区| 五月激情久久| 中文字幕系列一区| 国产精品久久| 日本成人在线不卡视频| 国产精品久久| 国产视频一区二| 激情综合婷婷| 国产精品地址| 日韩一区二区三区在线免费观看| 日韩激情网站| 成人日韩av| 免费av一区| 国产精品视频一区二区三区| 欧美精品高清| 日本成人在线不卡视频| 日韩高清一级| 亚洲三级网站| 免费一级片91| 久久视频国产| 视频在线观看国产精品| 午夜欧美在线| 亚洲香蕉久久| 精品国产亚洲一区二区在线观看| 日韩av黄色在线| 欧美一级二级三级视频| 欧美日韩亚洲一区在线观看| 中文字幕日本一区二区| 成人亚洲一区| 日本v片在线高清不卡在线观看| 国产日产一区| 婷婷综合在线| 亚洲精品一区二区在线播放∴| 日韩动漫一区| 亚洲午夜91| 亚洲先锋成人| 亚洲精品第一| 国产综合婷婷| 久久久久亚洲| 欧美精品激情| 亚州国产精品| 精品捆绑调教一区二区三区| 亚洲四虎影院| 久久精品二区亚洲w码| 久久国产精品免费精品3p| 日本大胆欧美人术艺术动态| 日韩视频一区| 久久精品国产68国产精品亚洲| 精品国产91| 日韩精品一区二区三区中文字幕| 视频一区在线视频| 在线 亚洲欧美在线综合一区| 国产一区二区三区四区| 另类欧美日韩国产在线| 国产精品久久久久久久久久白浆| 欧美午夜网站| 日本一区免费网站| 日韩精品欧美大片| 日本久久二区| 日韩av中文字幕一区| 亚洲精品观看| 日韩精品一卡二卡三卡四卡无卡| 亚洲韩日在线| 亚洲天堂久久| 激情视频一区二区三区| 亚洲天堂黄色| 国产视频亚洲| 噜噜噜躁狠狠躁狠狠精品视频| 国产一区二区精品| 免费久久99精品国产| 亚洲欧美高清| 天堂成人国产精品一区| 综合欧美亚洲| 日韩av网站免费在线| 国产精品亚洲四区在线观看 | 亚洲精品大片| 日本aⅴ免费视频一区二区三区| 日韩欧美高清一区二区三区| 亚洲精品第一| 欧美国产日本| 国产精品二区不卡| 99久久99视频只有精品| 亚洲欧美日韩一区在线观看| 日韩影片在线观看| 久久激情五月婷婷| 欧美激情视频一区二区三区在线播放| 久久字幕精品一区| 啪啪国产精品| 一区在线免费| 日韩一区二区三区精品| 国产精品亚洲二区| 久久久久久夜| 国产精品91一区二区三区| 午夜欧美精品| 亚洲精品乱码| 欧美在线日韩| 日韩a一区二区| 欧美日韩水蜜桃| 视频一区中文字幕| 久久超级碰碰| 久久中文字幕av一区二区不卡| 久久av在线| 国产精品玖玖玖在线资源| 日本欧美国产| 黄色亚洲免费| 国产毛片久久久| 九色porny丨国产首页在线| 香蕉视频成人在线观看| 中文无码日韩欧| 久久wwww| 欧美日韩一区二区综合| 日韩三级视频| 激情视频网站在线播放色| 国产日韩综合| 国产一区三区在线播放| 99亚洲精品| 久久亚州av| 男女性色大片免费观看一区二区| 国产黄色精品| 国产一区导航| 国产在线一区不卡| 老牛国产精品一区的观看方式| 精品免费av| 亚洲精品午夜av福利久久蜜桃| 国产精品一区二区av交换| 99国产精品一区二区| 欧美亚洲tv| 红桃视频国产一区| 精品一区二区三区视频在线播放 | 久久视频精品| 国产精品一区二区美女视频免费看| 久久久天天操| 国产精品一区二区三区美女| 久久久人人人| 国产精品麻豆成人av电影艾秋| 色婷婷久久久| 91精品美女| 91精品xxx在线观看|