精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring 為何需要三級緩存解決循環依賴,而不是二級緩存?

開發 后端
首先大家需要了解一下bean在spring中的生命周期,bean在spring的加載流程,才能夠更加清晰知道spring是如何解決循環依賴的。

前言

在使用spring框架的日常開發中,bean之間的循環依賴太頻繁了,spring已經幫我們去解決循環依賴問題,對我們開發者來說是無感知的,下面具體分析一下spring是如何解決bean之間循環依賴,為什么要使用到三級緩存,而不是二級緩存?

bean生命周期

首先大家需要了解一下bean在spring中的生命周期,bean在spring的加載流程,才能夠更加清晰知道spring是如何解決循環依賴的。

另外,Spring 系列面試題和答案全部整理好了,微信搜索Java技術棧,在后臺發送:面試,可以在線閱讀。

我們在spring的BeanFactory工廠列舉了很多接口,代表著bean的生命周期,我們主要記住的是我圈紅線圈出來的接口, 再結合spring的源碼來看這些接口主要是在哪里調用的

AbstractAutowireCapableBeanFactory類的doCreateBean方法是創建bean的開始,我們可以看到首先需要實例化這個bean,也就是在堆中開辟一塊內存空間給這個對象,createBeanInstance方法里面邏輯大概就是采用反射生成實例對象,進行到這里表示對象還并未進行屬性的填充,也就是@Autowired注解的屬性還未得到注入

我們可以看到第二步就是填充bean的成員屬性,populateBean方法里面的邏輯大致就是對使用到了注入屬性的注解就會進行注入,如果在注入的過程發現注入的對象還沒生成,則會跑去生產要注入的對象,第三步就是調用initializeBean方法初始化bean,也就是調用我們上述所提到的接口

可以看到initializeBean方法中,首先調用的是使用的Aware接口的方法,我們具體看一下invokeAwareMethods方法中會調用Aware接口的那些方法

我們可以知道如果我們實現了BeanNameAware,BeanClassLoaderAware,BeanFactoryAware三個Aware接口的話,會依次調用setBeanName(), setBeanClassLoader(), setBeanFactory()方法,再看applyBeanPostProcessorsBeforeInitialization源碼

發現會如果有類實現了BeanPostProcessor接口,就會執行postProcessBeforeInitialization方法,這里需要注意的是:如果多個類實現BeanPostProcessor接口,那么多個實現類都會執行postProcessBeforeInitialization方法,可以看到是for循環依次執行的,還有一個注意的點就是如果加載A類到spring容器中,A類也重寫了BeanPostProcessor接口的postProcessBeforeInitialization方法,這時要注意A類的postProcessBeforeInitialization方法并不會得到執行,因為A類還未加載完成,還未完全放到spring的singletonObjects一級緩存中。

最新面試題整理好了,大家可以在Java面試庫小程序在線刷題。

再看一個注意的點

可以看到ApplicationContextAwareProcessor也實現了BeanPostProcessor接口,重寫了postProcessBeforeInitialization方法,方法里面并調用了invokeAwareInterfaces方法,而invokeAwareInterfaces方法也寫著如果實現了眾多的Aware接口,則會依次執行相應的方法,值得注意的是ApplicationContextAware接口的setApplicationContext方法,再看一下invokeInitMethods源碼

發現如果實現了InitializingBean接口,重寫了afterPropertiesSet方法,則會調用afterPropertiesSet方法,最后還會調用是否指定了init-method,可以通過標簽,或者@Bean注解的initMethod指定,最后再看一張applyBeanPostProcessorsAfterInitialization源碼圖

發現跟之前的postProcessBeforeInitialization方法類似,也是循環遍歷實現了BeanPostProcessor的接口實現類,執行postProcessAfterInitialization方法。整個bean的生命執行流程就如上面截圖所示,哪個接口的方法在哪里被調用,方法的執行流程。

最后,對bean的生命流程進行一個流程圖的總結

三級緩存解決循環依賴

上一小節對bean的生命周期做了一個整體的流程分析,對spring如何去解決循環依賴的很有幫助。前面我們分析到填充屬性時,如果發現屬性還未在spring中生成,則會跑去生成屬性對象實例。

最新面試題整理好了,大家可以在Java面試庫小程序在線刷題。

我們可以看到填充屬性的時候,spring會提前將已經實例化的bean通過ObjectFactory半成品暴露出去,為什么稱為半成品是因為這時候的bean對象實例化,但是未進行屬性填充,是一個不完整的bean實例對象

spring利用singletonObjects, earlySingletonObjects, singletonFactories三級緩存去解決的,所說的緩存其實也就是三個Map

可以看到三級緩存各自保存的對象,這里重點關注二級緩存earlySingletonObjects和三級緩存singletonFactory,一級緩存可以進行忽略。前面我們講過先實例化的bean會通過ObjectFactory半成品提前暴露在三級緩存中

singletonFactory是傳入的一個匿名內部類,調用ObjectFactory.getObject()最終會調用getEarlyBeanReference方法。再來看看循環依賴中是怎么拿其它半成品的實例對象的。

我們假設現在有這樣的場景AService依賴BService,BService依賴AService

1. AService首先實例化,實例化通過ObjectFactory半成品暴露在三級緩存中

2. 填充屬性BService,發現BService還未進行過加載,就會先去加載BService

3. 再加載BService的過程中,實例化,也通過ObjectFactory半成品暴露在三級緩存

4. 填充屬性AService的時候,這時候能夠從三級緩存中拿到半成品的ObjectFactory

拿到ObjectFactory對象后,調用ObjectFactory.getObject()方法最終會調用getEarlyBeanReference()方法,getEarlyBeanReference這個方法主要邏輯大概描述下如果bean被AOP切面代理則返回的是beanProxy對象,如果未被代理則返回的是原bean實例。

這時我們會發現能夠拿到bean實例(屬性未填充),然后從三級緩存移除,放到二級緩存earlySingletonObjects中,而此時B注入的是一個半成品的實例A對象,不過隨著B初始化完成后,A會繼續進行后續的初始化操作,最終B會注入的是一個完整的A實例,因為在內存中它們是同一個對象。

下面是重點,我們發現這個二級緩存好像顯得有點多余,好像可以去掉,只需要一級和三級緩存也可以做到解決循環依賴的問題???

只要兩個緩存確實可以做到解決循環依賴的問題,但是有一個前提這個bean沒被AOP進行切面代理,如果這個bean被AOP進行了切面代理,那么只使用兩個緩存是無法解決問題,下面來看一下bean被AOP進行了切面代理的場景

我們發現AService的testAopProxy被AOP代理了,看看傳入的匿名內部類的getEarlyBeanReference返回的是什么對象。想成為架構師,這份架構師圖譜建議看看,少走彎路。

發現singletonFactory.getObject()返回的是一個AService的代理對象,還是被CGLIB代理的。再看一張再執行一遍singletonFactory.getObject()返回的是否是同一個AService的代理對象

我們會發現再執行一遍singleFactory.getObject()方法又是一個新的代理對象,這就會有問題了,因為AService是單例的,每次執行singleFactory.getObject()方法又會產生新的代理對象。

假設這里只有一級和三級緩存的話,我每次從三級緩存中拿到singleFactory對象,執行getObject()方法又會產生新的代理對象,這是不行的,因為AService是單例的,所有這里我們要借助二級緩存來解決這個問題,將執行了singleFactory.getObject()產生的對象放到二級緩存中去,后面去二級緩存中拿,沒必要再執行一遍singletonFactory.getObject()方法再產生一個新的代理對象,保證始終只有一個代理對象。還有一個注意的點

既然singleFactory.getObject()返回的是代理對象,那么注入的也應該是代理對象,我們可以看到注入的確實是經過CGLIB代理的AService對象。所以如果沒有AOP的話確實可以兩級緩存就可以解決循環依賴的問題,如果加上AOP,兩級緩存是無法解決的,不可能每次執行singleFactory.getObject()方法都給我產生一個新的代理對象,所以還要借助另外一個緩存來保存產生的代理對象

總結

前面先講到bean的加載流程,了解了bean加載流程對spring如何解決循環依賴的問題很有幫助,后面再分析到spring為什么需要利用到三級緩存解決循環依賴問題,而不是二級緩存。網上可以試試AOP的情形,實踐一下就能明白二級緩存為什么解決不了AOP代理的場景了

在工作中,一直認為編程代碼不是最重要的,重要的是在工作中所養成的編程思維。

責任編輯:龐桂玉 來源: Java團長
相關推薦

2022-12-02 12:01:30

Spring緩存生命周期

2025-06-26 01:55:00

2023-02-26 11:15:42

緩存循環依賴

2023-12-12 17:44:13

三級緩存Bean

2022-01-12 07:48:19

緩存Spring 循環

2009-06-18 15:24:35

Hibernate二級

2009-09-24 11:04:56

Hibernate二級

2009-09-21 14:59:31

Hibernate二級

2013-09-08 23:30:56

EF Code Fir架構設計MVC架構設計

2022-05-08 19:23:28

Spring循環依賴

2009-09-23 09:37:07

Hibernate緩存

2009-09-21 14:39:40

Hibernate二級

2009-09-21 13:31:10

Hibernate 3

2024-03-18 00:00:00

SpringBean設計

2024-03-04 08:47:17

Spring框架AOP

2024-12-20 16:46:22

Spring三級緩存

2009-06-10 15:00:58

Hibernate二級配置

2025-04-29 07:06:20

2023-08-01 08:10:46

內存緩存

2021-01-29 14:14:47

動態代理緩存
點贊
收藏

51CTO技術棧公眾號

午夜在线播放视频欧美| 看欧美ab黄色大片视频免费 | 亚洲美女av在线播放| 欧美做暖暖视频| 国产成人自拍一区| 视频一区欧美日韩| 欧美成人午夜剧场免费观看| 天堂www中文在线资源| 成人福利视频| 亚洲天堂成人在线观看| 国产精品区一区| 精品国产乱子伦| 欧美在线看片| 亚洲欧美日韩天堂| 三级黄色片免费观看| 在线观看v片| 综合中文字幕亚洲| 久久精品中文字幕一区二区三区| 免费在线观看av的网站| 欧美日韩亚洲一区| 国产亚洲xxx| 亚洲美女在线播放| 一区二区三区无毛| 一本大道av一区二区在线播放| 一区高清视频| 天堂√在线中文官网在线| 久久99精品久久久久久久久久久久| 欧美激情视频在线观看| 五月天精品视频| 2020国产精品极品色在线观看| 在线亚洲一区二区| 全黄性性激高免费视频| 午夜视频成人| av电影在线观看不卡| 91精品国产综合久久香蕉的用户体验| 久久黄色精品视频| 国内自拍视频一区二区三区| 中文字幕综合在线| 日韩av一二区| 成人台湾亚洲精品一区二区| 91精品国产色综合久久不卡电影| 国产日韩成人内射视频| 国产伦理精品| 亚洲制服欧美中文字幕中文字幕| 亚洲ai欧洲av| 四虎在线免费观看| 波多野结衣亚洲一区| 99久久综合狠狠综合久久止| 国产三级午夜理伦三级| 美女视频网站久久| 国产精品第2页| 日本视频免费在线| 亚洲电影在线| 午夜精品视频在线| 久久精品国产亚洲av高清色欲 | 亚洲午夜av久久乱码| 亚洲熟妇无码av| 婷婷成人影院| 亚洲欧洲在线看| 91视频在线网站| 免费一区二区| 亚洲视频在线观看免费| 欧美做受xxxxxⅹ性视频| 久久99久久人婷婷精品综合 | www国产视频| 9l视频自拍蝌蚪9l视频成人| 日韩美女一区二区三区四区| 亚洲丝袜在线观看| 午夜免费欧美电影| 欧美精品一区二区三区蜜臀 | 中文字幕久久精品一区二区| 日韩久久久精品| 成年人小视频在线观看| 激情小说一区| 亚洲欧美日韩中文视频| www亚洲色图| 欧美国产美女| 免费不卡在线观看av| 久久久久久免费观看| 亚洲国产综合在线看不卡| 91精品国产一区| 无码人妻精品一区二区蜜桃色欲| 人禽交欧美网站| 成人淫片在线看| 日本黄视频在线观看| 久久久91精品国产一区二区精品| 先锋在线资源一区二区三区| 九七久久人人| 性做久久久久久免费观看| 久久久久久久久久久久久国产精品 | 18国产精品| 国产视频精品一区二区三区| 免费一级黄色录像| 欧美精品三区| 国产91精品青草社区| 自拍偷拍福利视频| 国产福利一区在线| 麻豆av一区二区| 日本视频在线播放| 无码av中文一区二区三区桃花岛| 亚洲狼人综合干| 欧美午夜在线播放| 亚洲欧美精品suv| 成人免费精品动漫网站| 极品日韩av| 国产日韩av在线播放| 人妻精品无码一区二区| 国产女人aaa级久久久级| 777久久精品一区二区三区无码| 涩涩av在线| 欧美顶级少妇做爰| 波多野结衣片子| 欧美黄免费看| 国产精品第一视频| 免费成人在线看| 国产精品国产a| 青青草原av在线播放| 欧美视频三区| 最近2019中文免费高清视频观看www99| 久久亚洲成人av| 麻豆精品视频在线观看视频| 精品乱子伦一区二区三区| 国产在线观看av| 91黄色免费观看| 午夜不卡久久精品无码免费| 91精品一区二区三区综合| 日韩美女毛茸茸| 亚洲第九十九页| 亚洲婷婷国产精品电影人久久| 少妇高潮喷水久久久久久久久久| 日韩免费成人| 俺也去精品视频在线观看| 可以免费看的av毛片| 国产福利一区二区三区视频| 亚洲欧洲精品一区| 成人午夜精品| 日韩毛片在线观看| 国产无精乱码一区二区三区| 国内精品免费在线观看| 亚洲国产另类久久久精品极度| 性感女国产在线| 亚洲国产精品国自产拍av秋霞| 国产激情无码一区二区三区| 久久精品国产精品青草| 日本午夜一区二区三区| 26uuu亚洲电影| 日韩激情av在线免费观看| 免费在线观看黄色av| 极品美女销魂一区二区三区| 视频一区二区三区在线观看| 日日av拍夜夜添久久免费| 日韩久久午夜影院| 国产精品视频123| 91美女在线视频| 日韩激情免费视频| 日韩av字幕| 欧美精品久久久久久久久久 | 亚洲国产美女精品久久久久∴| 国产真人真事毛片| 成人午夜激情影院| 你真棒插曲来救救我在线观看| 视频精品一区| 久久久久免费视频| 国精品人妻无码一区二区三区喝尿 | 久久久福利视频| 暖暖成人免费视频| 一区二区欧美日韩视频| 伊人网视频在线| 国产精品福利在线播放| 国产欧美一区二| 亚洲综合色网| 韩国成人av| 亚洲伦乱视频| 久久精品99久久久久久久久| 国产高清免费av| 午夜视频一区在线观看| 久久福利小视频| 久久免费国产| 亚洲天堂电影网| www.久久99| 久久久久久久91| 男操女在线观看| 欧美性大战久久久| 少妇被躁爽到高潮无码文| 国产传媒欧美日韩成人| 波多野结衣乳巨码无在线| 精品视频免费| 99se婷婷在线视频观看| av福利在线导航| 亚洲欧美国产精品专区久久| 国产又黄又粗又长| 午夜日韩在线电影| 丰满的亚洲女人毛茸茸| 国产成人在线视频网址| 欧美日韩在线一| 国产精品国内免费一区二区三区| 成人在线资源网址| 午夜无码国产理论在线| 欧美超级乱淫片喷水| 午夜小视频在线播放| 欧美日韩精品系列| 日本免费一二三区| 国产精品私人影院| 女同性恋一区二区三区| 蜜臀av性久久久久av蜜臀妖精| 亚洲精品少妇一区二区| 国产一区二区三区四区二区| www.久久草| 日本黄色一区| 97香蕉久久超级碰碰高清版| 在线视频1区2区| 日韩av在线网页| 国产露脸无套对白在线播放| 精品久久久久久久久国产字幕| 亚洲综合久久av一区二区三区| 波多野结衣91| 先锋资源在线视频| 日韩av在线发布| 欧美精品久久久久久久自慰| 91综合视频| 欧洲精品久久| 国产伦理久久久久久妇女 | 日韩精品一区二区三区高清免费| 风间由美一区二区av101| 国产精品久久久久影院日本| 波多野结衣中文字幕久久| 日韩有码在线视频| 国产高清免费av在线| 亚洲国产高潮在线观看| av中文字幕免费| 欧美日韩情趣电影| 亚洲无码精品一区二区三区| 午夜欧美视频在线观看| 欧美成人精品欧美一级私黄| 中文字幕精品一区| 少妇人妻好深好紧精品无码| 久久综合九色综合欧美亚洲| 国产精品入口麻豆| 国产福利一区在线| 久久久久亚洲av无码麻豆| 六月丁香婷婷色狠狠久久| 男女av免费观看| av成人毛片| 国产综合中文字幕| 国产伊人精品| 久久手机在线视频| 欧美精品国产一区| 台湾无码一区二区| 欧美日韩影院| 国产尤物av一区二区三区| 欧美激情五月| 欧美图片激情小说| 在线观看视频日韩| 黄色国产一级视频| 91久久午夜| 亚洲熟妇av日韩熟妇在线| 亚洲视频播放| 欧美精品99久久| 久久精品一区| 国产裸体免费无遮挡| 天堂av在线一区| av网站在线不卡| 美女视频一区在线观看| 又色又爽又黄视频| 国产一区在线观看麻豆| 69久久精品无码一区二区| 国产成人av电影| 午夜视频在线观看国产| 91麻豆精品秘密| 国产精品天天干| 国产精品久久久久精k8| 国产激情无码一区二区三区| 一区二区三区精密机械公司| 国产在线观看免费av| 日韩欧美999| 中文字幕视频一区二区| 91精品国产91久久综合桃花| 人妻一区二区三区免费| 亚洲图中文字幕| 50度灰在线| 9.1国产丝袜在线观看| 欧美日韩精品免费观看视完整| 国产精品免费一区豆花| 国产欧美视频在线| 精品91免费| 一道在线中文一区二区三区| 亚洲欧洲精品一区二区| 极品中文字幕一区| 欧美黄色一级片视频| 久久99精品一区二区三区 | eeuss国产一区二区三区| 手机看片福利视频| 亚洲综合另类小说| 国产一级片av| 91精品国产日韩91久久久久久| 污视频软件在线观看| 中文字幕日韩视频| 国产第一页在线| 国产精品免费一区| 精品精品国产毛片在线看| 亚洲成色最大综合在线| 亚洲激情一区| 成人综合久久网| 91亚洲大成网污www| 北条麻妃在线观看视频| 性欧美大战久久久久久久久| 伊人色综合久久久| 国产视频精品在线| 欧美性受ⅹ╳╳╳黑人a性爽| 人妖精品videosex性欧美| 91麻豆精品激情在线观看最新 | 欧美日韩福利| 一区二区三区免费播放| www.亚洲精品| 免费网站看av| 911精品国产一区二区在线| 青青草免费观看免费视频在线| 超碰91人人草人人干| 播放一区二区| 欧美不卡1区2区3区| 亚洲第一在线| 在线播放第一页| 1区2区3区精品视频| 在线观看不卡的av| 亚洲欧美资源在线| 日韩精品av| dy888夜精品国产专区| 亚洲精品2区| 亚洲精品自拍网| 国产视频一区二区在线| 四虎成人永久免费视频| 亚洲精品国产免费| 草莓视频丝瓜在线观看丝瓜18| 91人成网站www| 国产精品久久久乱弄| www.这里只有精品| 国产精品美女一区二区三区| 亚洲欧美日韩一区二区三区四区| 亚洲毛片在线看| 在线成人av观看| 欧美一区二区三区成人久久片| 国产亚洲一区在线| 北岛玲一区二区| 欧美午夜性色大片在线观看| 亚欧洲精品视频| 欧美又大又硬又粗bbbbb| 亚洲区小说区图片区qvod| 国产乱子夫妻xx黑人xyx真爽| 91超碰免费在线| 久久亚洲精品小早川怜子66| 成人国产精选| 国产精品国模大尺度私拍| 日韩在线第七页| 亚洲国产精品三区| 国产精品免费久久久久| av首页在线观看| 深夜福利日韩在线看| 色猫猫成人app| 亚洲午夜精品久久| 久久国产生活片100| 娇妻被老王脔到高潮失禁视频| 色综合色综合色综合色综合色综合 | 午夜视频免费在线| 欧美精品一区三区| 成人线上播放| 国产精品裸体瑜伽视频| 久久综合久久综合久久| 欧美特级黄色片| 日韩一区二区福利| 成人污污www网站免费丝瓜| 一区二区视频在线播放| 精彩视频一区二区三区| 久久99久久99精品免费看小说| 欧美一区二区黄色| 欧美videossex| 欧美国产一二三区| 奇米777欧美一区二区| 老司机精品免费视频| 6080yy午夜一二三区久久| 日本在线视频站| 国产99在线播放| 亚洲精选久久| 免费看的黄色录像| 宅男噜噜噜66一区二区66| 9999热视频在线观看| 久久综合精品一区| 国精产品一区一区三区mba桃花 | 国产 日韩 欧美 综合 一区| 色欲色香天天天综合网www| 99久久国产综合色|国产精品| 欧美一区二区三区四| 一区二区欧美亚洲| 丁香综合av| 日韩在线第三页| 亚洲一区二区三区四区的| 亚洲av成人无码网天堂| 91久久精品久久国产性色也91| 欧美性色综合| 国产一二三四视频| 欧美精品一区二区三区在线播放|