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

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

開發 架構
既然singleFactory.getObject()返回的是代理對象,那么注入的也應該是代理對象,我們可以看到注入的確實是經過CGLIB代理的AService對象。

前言

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

bean生命周期

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

bean的生命周期方法

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

doCreateBean方法

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

createBeanInstance方法

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

initializeBean方法初始化bean

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

invokeAwareMethods方法

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

applyBeanPostProcessorsBeforeInitialization方法

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

再看一個注意的點

ApplicationContextAwareProcessor接口

invokeAwareInterfaces方法

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

invokeInitMethods源碼

發現如果實現了InitializingBean接口,重寫了afterPropertiesSet方法,則會調用afterPropertiesSet方法,最后還會調用是否指定了init-method,可以通過<bean

init-method>標簽,或者@Bean注解的initMethod指定,最后再看一張applyBeanPostProcessorsAfterInitialization源碼圖

applyBeanPostProcessorsAfterInitialization源碼

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

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

bean的生命流程

三級緩存解決循環依賴

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

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

三級緩存

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

三級緩存使用

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

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

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

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

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

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

填充屬性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()方法都給我產生一個新的代理對象,所以還要借助另外一個緩存來保存產生的代理對象

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2022-03-01 18:03:06

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二級

2013-09-08 23:30:56

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

2009-09-21 14:59:31

Hibernate二級

2009-09-24 11:04:56

Hibernate二級

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技術棧公眾號

久久影院视频免费| 国产免费成人| 日韩欧美国产综合一区| 国产深夜男女无套内射| 免费在线性爱视频| 狠狠色丁香九九婷婷综合五月| 欧美人交a欧美精品| 真人bbbbbbbbb毛片| 国精品产品一区| 亚洲国产一区二区a毛片| 欧美日韩一区二区视频在线观看 | 国产精品wwwwww| 男女性高潮免费网站| 欧美黑白配在线| 欧美日本免费一区二区三区| 黄色三级中文字幕| 91av资源在线| 久久亚洲一区二区三区四区| 91系列在线观看| 天堂网免费视频| 亚洲激精日韩激精欧美精品| 三级精品视频久久久久| 中文字幕在线观看网址| 国产精品高清一区二区| 在线观看视频一区二区| 国产v片免费观看| 黄色一级大片在线免费看产| 久久久国际精品| 精品国产免费人成电影在线观...| 国产一区二区三区视频免费观看| 久久av在线| 97在线观看免费| 久草免费新视频| 久久精品一区二区不卡| 一区二区三区久久精品| 美女又爽又黄视频毛茸茸| 久久天堂久久| 欧美精品国产精品| 嫩草影院国产精品| 成人在线爆射| 色综合天天综合网天天看片| 欧美一级片免费播放| 婷婷av在线| 一区二区视频在线看| 国产精品av免费| 在线观看免费版| 国产精品久久久久影院老司 | 51自拍视频在线观看| 日本h片久久| 在线精品视频一区二区| 成年人免费大片| 午夜日韩成人影院| 在线观看日韩一区| 我看黄色一级片| jizz欧美| 欧美日韩精品系列| 在线观看免费不卡av| 亚洲伦理网站| 91精品国产福利在线观看| 午夜免费看毛片| 四虎国产精品免费久久| 777亚洲妇女| 日本女人性视频| 伊人www22综合色| 精品国产乱码久久| 国产三级视频网站| 精品国产99| 中文字幕精品一区二区精品| 中国1级黄色片| 亚洲mv大片欧洲mv大片| 久久91精品国产91久久跳| 中文字幕av免费在线观看| 黄色在线一区| 欧美在线日韩在线| 亚洲婷婷久久综合| 国产在线一区二区综合免费视频| 亚洲精品免费网站| 人妻无码中文字幕| 久久蜜桃av一区二区天堂| 色视频一区二区三区| 美女黄视频在线观看| 亚洲午夜免费电影| 久久精品午夜福利| 国产不卡精品| 日韩高清免费观看| 99自拍偷拍视频| 欧美日韩蜜桃| 国产大片精品免费永久看nba| 中文字幕 国产| 国产高清不卡二三区| 久久精品aaaaaa毛片| av每日在线更新| 亚洲影院久久精品| 免费激情视频在线观看| 麻豆精品一区| 亚洲女人天堂网| 国产十六处破外女视频| 亚洲综合二区| 亚洲综合社区网| 黄色大片在线免费观看| 亚洲蜜臀av乱码久久精品| 国产中文字幕视频在线观看| 久久久久毛片| 日韩三级在线免费观看| 亚洲专区区免费| 欧美va亚洲va日韩∨a综合色| 久久久久久亚洲精品| 蜜臀尤物一区二区三区直播| 国产黄色成人av| 午夜久久资源| 成人免费看视频网站| 日韩视频中午一区| 欧美激情亚洲色图| 亚洲美女黄色| 亚洲精品欧美日韩专区| 成人综合影院| 欧美日韩国产精品一区二区不卡中文| 97人人爽人人| 欧美一区电影| 国产99久久精品一区二区永久免费| av资源免费看| 国产精品久久午夜夜伦鲁鲁| 欧美日韩精品在线一区二区| 国产电影一区| 中文字幕久久精品| 日韩欧美国产另类| 91丨porny丨蝌蚪视频| 香港三级日本三级a视频| 伊人久久综合网另类网站| 亚洲色图在线观看| 久久一区二区三区视频| 成人午夜私人影院| 国内精品国产三级国产99| 国产精品麻豆成人av电影艾秋| 日韩av网站电影| 亚洲激情视频一区| 成人免费视频一区| 一二三四中文字幕| 精品国产亚洲一区二区三区在线| 中文字幕欧美日韩va免费视频| 高清乱码免费看污| www成人在线观看| 北条麻妃在线视频观看| 少妇高潮一区二区三区| 97婷婷大伊香蕉精品视频| 欧美 日韩 国产 在线| 一卡二卡三卡日韩欧美| 亚洲欧美日韩中文字幕在线观看| 91精品1区| 亚洲精品免费av| 秋霞在线午夜| 亚洲第一男人av| 中日韩黄色大片| 久久综合久久综合久久综合| 国产精品欧美激情在线观看| 免费电影一区二区三区| 国产成人短视频| jizz在线免费观看| 欧美精品一级二级三级| 国产三级国产精品国产国在线观看| 国产原创一区二区三区| 菠萝蜜视频在线观看入口| 日韩精品一区二区三区中文| 欧美高清激情视频| 欧美熟妇乱码在线一区| 欧美日韩精品在线视频| 亚洲国产av一区| 蜜桃精品在线观看| 欧洲精品视频在线| 国产亚洲精品美女久久 | 免费成人毛片| 久久艹在线视频| 免费国产黄色片| 色婷婷综合激情| 国产一区在线观看免费| 国产黄色精品视频| 国产91美女视频| 日韩中文在线电影| www 成人av com| 自由日本语热亚洲人| 在线视频精品一| 国产成人精品无码高潮| 精品人伦一区二区三区蜜桃网站 | 亚洲精品伦理在线| 亚洲av网址在线| 免费成人小视频| 嫩草影院中文字幕| 欧美一区2区| 国产伦精品一区二区| 裤袜国产欧美精品一区| 久久伊人免费视频| 免费看男男www网站入口在线| 欧美喷潮久久久xxxxx| 国产五月天婷婷| 国产精品素人视频| 尤物网站在线观看| 精品中文av资源站在线观看| 2018国产在线| 国产精品精品国产一区二区| 国产主播一区二区三区四区| 日韩城人网站| 欧美在线视频a| 青春草在线免费视频| 中文字幕视频在线免费欧美日韩综合在线看 | 国产偷人妻精品一区| 精品一区二区在线播放| 97国产精东麻豆人妻电影| 伊人久久大香线| 日本在线观看不卡| 老司机成人在线| 91在线免费看网站| 电影亚洲一区| 欧美一区在线直播| 怡红院在线播放| 原创国产精品91| 天堂а√在线8种子蜜桃视频| 555www色欧美视频| 亚洲精品毛片一区二区三区| 亚洲超丰满肉感bbw| 男女性高潮免费网站| 国产精品久久久久久久久免费桃花 | 国产免费观看高清视频| 欧美黄色一区二区| 亚洲一一在线| 九九热爱视频精品视频| 国产尤物99| 香港久久久电影| 成人两性免费视频| 欧美少妇激情| 国产精品爽黄69| 99久久伊人| 日韩免费在线播放| 神马电影网我不卡| 热门国产精品亚洲第一区在线| 日本伦理一区二区| 九九久久精品一区| 中文字幕在线三区| 久热精品视频在线免费观看| 欧美激情午夜| xx视频.9999.com| 免费av网站在线看| 久久久国产视频91| a级片国产精品自在拍在线播放| 日韩有码在线播放| а√天堂官网中文在线| 免费97视频在线精品国自产拍| 成人福利在线观看视频| 超碰精品一区二区三区乱码| 超碰免费公开在线| 欧美另类交人妖| 黄色影院在线看| 性色av一区二区三区免费| 玖玖在线播放| 国产91免费看片| 丁香婷婷久久| 91久久在线播放| 一区二区三区亚洲变态调教大结局 | 97se亚洲| 狠狠色噜噜狠狠色综合久| 台湾佬综合网| 日韩欧美亚洲精品| 精品一区二区三区在线| 亚洲精品一卡二卡三卡四卡| 久久免费大视频| 日本老太婆做爰视频| 黄色av一区| 日本黄网站免费| 免费一级欧美片在线观看| 玖玖爱视频在线| 国产成人综合网站| 特大黑人巨人吊xxxx| 欧美国产1区2区| 高h视频免费观看| 性久久久久久久久| 国产真人无遮挡作爱免费视频| 欧美视频精品在线观看| 999国产精品视频免费| 亚洲高清福利视频| 成年人在线看| 久久999免费视频| 天堂电影一区| 91九色视频导航| 粉嫩久久久久久久极品| 日韩久久精品一区二区三区| 91成人精品| 少妇高潮喷水久久久久久久久久| 蜜臀va亚洲va欧美va天堂 | 亚洲自拍偷拍另类| 欧美精品一区二区三区在线| 蜜桃视频在线观看网站| 免费av在线一区| 国产精品久久亚洲不卡| 大波视频国产精品久久| 成人精品亚洲| 精品无码一区二区三区在线| 免费人成黄页网站在线一区二区| 亚洲少妇一区二区| 国产免费久久精品| 日韩精品一区二区三| 91精品国产手机| 第九色区av在线| 午夜欧美大片免费观看| 亚洲一区导航| 欧美日韩三区四区| 伊人成人在线| 免费黄频在线观看| 国产欧美精品一区二区三区四区| 精品无码久久久久| 欧美电影一区二区| 高清av在线| 538国产精品一区二区免费视频| 国产精品国产亚洲精品| 日韩高清av| 国产精品资源| 国产精品扒开腿做爽爽爽a片唱戏| 国产精品色一区二区三区| 天天干天天干天天| 亚洲成人网av| 国产精品刘玥久久一区| 国产精品黄色av| 亚洲三级精品| 国产96在线 | 亚洲| 国产精品99久久久久久似苏梦涵| 东京热无码av男人的天堂| 色综合久久精品| 天堂av在线免费观看| 久久久久久成人精品| 国产色99精品9i| 9999在线观看| 六月丁香综合在线视频| 日韩免费成人av| 色噜噜狠狠色综合中国| 日本免费不卡| 91成人国产在线观看| 欧美在线关看| 给我免费播放片在线观看| 国产91丝袜在线18| 亚洲av鲁丝一区二区三区 | 992tv人人草| 亚洲人成在线观看一区二区| 91激情在线观看| 久久久精品网站| 国产一区2区在线观看| 国产高清免费在线| 国产精品一二三四| 精品无码久久久久| 亚洲精品国产精品乱码不99按摩 | 亚洲电影在线播放| 亚洲精选一区二区三区| 欧美黄色片在线观看| 成人h动漫免费观看网站| 蜜臀av色欲a片无码精品一区| 高清shemale亚洲人妖| 国产第一页第二页| 国产视频精品久久久| 欧美极品影院| 亚洲韩国在线| 国产精品1区2区| 日韩精品国产一区二区| 亚洲欧洲激情在线| 99久久er| 久久av高潮av| 99这里只有久久精品视频| 91视频久久久| 精品国产一区二区三区久久久狼| 国产色99精品9i| 成人一对一视频| 国产精品三级在线观看| www.天堂av.com| 久久久久久伊人| 国产精品密蕾丝视频下载| 奇米视频7777| 亚瑟在线精品视频| 午夜福利一区二区三区| 国产精品精品一区二区三区午夜版| 欧美mv日韩| 中国特级黄色大片| 在线中文字幕一区| 97精品人人妻人人| 欧美喷水视频| 国产xxx在线观看 | 国产精品自拍合集| 久久婷婷综合激情| 国产一区二区三区成人| 97精品一区二区三区| 欧美三级伦理在线| 成人免费播放视频| 色综合久久88色综合天天6| 日本在线免费看| 精品视频免费观看| 国产一区二区在线电影| 久久99精品波多结衣一区| www.欧美免费| 欧美大奶一区二区| 一级网站在线观看| 一本色道久久综合狠狠躁的推荐| 免费黄色在线看| 麻豆久久久9性大片| 国产一区二区不卡老阿姨| 国产精品第5页|