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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

瀏覽:148日期:2023-08-10 16:02:30

實(shí)例化方法,把bean實(shí)例化,并且包裝成BeanWrapper

1、點(diǎn)進(jìn)這個(gè)方法里面。

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

這個(gè)方法是反射調(diào)用類中的 factoryMethod 方法。 這要知道@Bean 方法的原理, 實(shí)際上spring 會(huì)掃描有@bean 注解的方法, 然后把方法名稱設(shè)置到 BeanDefinition 的 factoryMethod屬性中, 接下來(lái)就會(huì)調(diào)到上面截圖中的方法實(shí)現(xiàn)@Bean 方法的調(diào)用。

2、 有參構(gòu)造函數(shù)的時(shí)候

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

determineConstructorsFromBeanPostProcessors這個(gè)方法是 BeanPostProcessor 接口類的首次應(yīng)用, 最終會(huì)掉到AutowiredAnnotationBeanPostProcessor 類的方法, 在方法中會(huì)掃描有注解的構(gòu)造函數(shù)然后完成裝配過(guò)程。 然后把有有@Autowired 注解的構(gòu)造函數(shù)返回。

3、 無(wú)參構(gòu)造函數(shù)的實(shí)例化

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

這就是簡(jiǎn)單的反射實(shí)例化。 大部分類的實(shí)例化都會(huì)走這個(gè)邏輯

4、 類中注解的收集

實(shí)例化完成后接下來(lái)就需要對(duì)類中的屬性進(jìn)行依賴注入操作, 但是類里面屬性和方法的依賴注入往往用@Autowired 或者@Resource 注解, 那么這些注解的依賴注入是如何完成的呢?

注解的收集:

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

也是通過(guò) BeanPostProcessor 接口類型實(shí)例來(lái)挨個(gè)處理的。

A、 首先是CommonAnnotationBeanPostProcessor 類, 這個(gè)類完成了@Resource 注解的屬性或者方法的收集

這個(gè)類還對(duì)@PostConstruct 和@PreDestory 支持

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

收集過(guò)程

1、 看緩存里面有沒(méi)有 InjectionMetadata 對(duì)象

2、 從類中獲取所有 Field 對(duì)象, 循環(huán) field 對(duì)象, 判斷 field 有沒(méi)有@Resource 注解,如果有注解封裝成 ResourceElement 對(duì)象

3、 從類中獲取所有 Method 對(duì)象, 循環(huán) Method 對(duì)象, 判斷 Method 有沒(méi)有@Resource

注解, 如果有注解封裝成 ResourceElement 對(duì)象

4、 最終把兩個(gè) field 和 Method 封裝的對(duì)象集合封裝到 InjectionMetadata 對(duì)象中

B、 然后是AutowiredAnnotationBeanPostProcessor 類, 對(duì)@Autowired 注解的屬性和方法的收集。 收集過(guò)程基本上跟@Resource 注解的收集差不多, 這里就不贅述了

5、 IOCDI 依

對(duì)應(yīng)的方法:

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

這里又是一個(gè) BeanPostProcessor 類型接口的運(yùn)用, 前面我們講到了@Resource@Autowired 注解的收集, 那么這個(gè)方法就是根據(jù)收集到的注解進(jìn)行反射調(diào)用。

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

循環(huán)收集到的 metaData 中的 list 對(duì)象, 然后挨個(gè)調(diào)用里面的 InjectedElement 的inject 方法完成依賴注入。

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

其中 value 值的獲取, 如果依賴的屬性是一個(gè)引用類型必定會(huì)觸發(fā)該屬性的BeanFactory.getBean 操作, 從而從 spring 容器中獲取到對(duì)應(yīng)的實(shí)例。 方法的依賴注入類似這里就不再贅述。

6、 bean 實(shí)例化后的操作

代碼走到這里:

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

A、 首先是對(duì)某些 Aware 接口的調(diào)用

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

B、 然后@PostConstruct 注解方法的調(diào)用

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

這里又是一個(gè) BeanPostProcessor 接口的運(yùn)用,前面講過(guò), 有@PostConstruct 注解的方法會(huì)收集到一個(gè) met就是通過(guò) BeanPostProcessor 接口調(diào)到CommonAnnotationBeanPostProcessor 類, 然后在類中拿根據(jù)對(duì)象里面的容器來(lái)反射調(diào)用有注解的方法。 代碼如下:

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

有@PostConstruct 注解的容器會(huì)收集到 initMethods 容器中, 接下來(lái)就是方法的

反射調(diào)用。

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

C、 InitializingBean 接口和 init-method 屬性調(diào)用

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

Init-method 屬性調(diào)用是在 afterPropertiesSet 之后

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

afterPropertiesSet和Init-method和有@PostConstruct注解的方法其實(shí)核心功能都是一樣的, 只是調(diào)用時(shí)序不一樣而已, 都是在該類實(shí)例化和 IOC 做完后調(diào)用的, 我們可以在這些方法中做一些在 spring 或者 servlet 容器啟動(dòng)的時(shí)候的初始化工作。 比如緩存預(yù)熱, 比如緩存數(shù)據(jù)加載到內(nèi)存, 比如配置解析, 等等初始化工作。

在這個(gè)方法里面還有一個(gè)重要的邏輯

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

也是一個(gè) BeanPostProcessor 接口的運(yùn)用, 在這里會(huì)返回 bean 的代理實(shí)例, 這個(gè)就是 AOP 的入口。

D、 FactoryBean 接口

帶入如下:

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

在實(shí)例化和 IOC/DI 做完后, 就會(huì)調(diào)用 FactoryBean 類型的接口, 如果要獲取到FactoryBean 類本身, 就必須加上”&”符號(hào), 比如beanFactory.getBean(“&beanName” )。

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

BeanFactory.getBean(“beanName”)只能獲取到getObject()方法返回的實(shí)例。

getObject方法返回的實(shí)例會(huì)有單獨(dú)的緩存存儲(chǔ), 跟其他實(shí)例不是同一個(gè)緩存, 對(duì)應(yīng)的緩存是:factoryBeanObjectCache

E、 循環(huán)依賴

循環(huán)依賴請(qǐng)參照流程圖理解https://www.processon.com/view/link/5df9ce52e4b0c4255ea1a84f

循環(huán)依賴只會(huì)出現(xiàn)在單例實(shí)例無(wú)參構(gòu)造函數(shù)實(shí)例化情況下

有參構(gòu)造函數(shù)的加@Autowired 的方式循環(huán)依賴是直接報(bào)錯(cuò)的, 多例的循環(huán)依賴也是直接報(bào)錯(cuò)的

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用

循環(huán)依賴步驟:

1、 A 類無(wú)參構(gòu)造函數(shù)實(shí)例化后, 設(shè)置三級(jí)緩存

2、 A 類 populateBean 進(jìn)行依賴注入, 這里觸發(fā)了 B 類屬性的 getBean 操作

3、 B 類無(wú)參構(gòu)造函數(shù)實(shí)例化后, 設(shè)置三級(jí)緩存

4、 B 類 populateBean 進(jìn)行依賴注入, 這里觸發(fā)了 A 類屬性的 getBean 操作

5、 A 類之前正在實(shí)例化, singletonsCurrentlyInCreation 集合中有已經(jīng)有這個(gè) A 類了, 三級(jí)緩存里面也有了, 所以這時(shí)候是從三級(jí)緩存中拿到的提前暴露的A 實(shí)例, 該實(shí)例還沒(méi)有進(jìn)行 B 類屬性的依賴注入的, B 類屬性為空。

6、 B 類拿到了 A 的提前暴露實(shí)例注入到 A 類屬性中了

7、 B 類實(shí)例化已經(jīng)完成, B 類的實(shí)例化是由 A 類實(shí)例化中 B 屬性的依賴注入觸發(fā)的 getBean 操作進(jìn)行的, 現(xiàn)在 B 已經(jīng)實(shí)例化, 所以 A 類中 B 屬性就可以完成依賴注入了, 這時(shí)候 A 類 B 屬性已經(jīng)有值了

8、 B 類 A 屬性指向的就是 A 類實(shí)例堆空間, 所以這時(shí)候 B 類 A 屬性也會(huì)有值了。

總結(jié)

到此這篇關(guān)于spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用的文章就介紹到這了,更多相關(guān)spring源碼bean的初始化及循環(huán)引用內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
色一区二区三区| 国产精品久久亚洲不卡| 国产成人精品免费视| 欧美激情在线精品一区二区三区| 91福利精品在线观看| 欧美亚洲tv| 国产高清视频一区二区| 高清一区二区| 国产91久久精品一区二区| 91高清一区| 丝袜美腿一区二区三区| 最新日韩av| 免费看日韩精品| 日韩av一区二区在线影视| 国产亚洲人成a在线v网站| 国产精品男女| 天堂8中文在线最新版在线| 日韩欧美午夜| 久久激情一区| 亚洲深夜影院| 日韩欧美中文字幕在线视频| 国产精品对白久久久久粗| 欧美好骚综合网| 九九综合九九| 日韩国产在线观看| 久久精品欧洲| 国产精品字幕| 国产精品三上| 国产欧美日韩| 亚洲三级欧美| 三级欧美在线一区| 国产欧美亚洲一区| 中文字幕成在线观看| 亚洲精品99| 欧美日韩亚洲一区在线观看| 岛国av在线网站| 香蕉久久久久久久av网站| 国产欧美日韩免费观看| 欧美日韩国产v| 影音先锋久久精品| 久久中文字幕一区二区三区| 久久精品中文| 亚洲视频二区| 水蜜桃精品av一区二区| 不卡在线一区二区| 国产精品中文字幕制服诱惑| 日本精品影院| 日韩avvvv在线播放| 中文字幕在线看片| 国产精品99一区二区| 91精品福利观看| 青青久久av| 日韩av黄色在线| 日韩欧美看国产| 69堂精品视频在线播放| 深夜福利视频一区二区| 四虎精品一区二区免费| 精品久久久亚洲| 一区二区91| 色爱av综合网| 国产精品亚洲一区二区在线观看| 亚洲特色特黄| 麻豆一区二区在线| 亚洲欧美日韩精品一区二区 | 欧美亚洲国产日韩| 欧美日韩色图| 国产美女亚洲精品7777| 久久亚洲专区| 国产精品视频3p| 模特精品在线| 国产伦久视频在线观看| 日日摸夜夜添夜夜添国产精品| 另类中文字幕国产精品| 国产精品xxx| 中文字幕日本一区二区| 久久国产免费| 精品一区av| 亚欧洲精品视频在线观看| 99久久夜色精品国产亚洲1000部| 国产精品久久久久av蜜臀| 伊人久久一区| 午夜欧美精品| 日本黄色精品| 国产精品亚洲成在人线| 在线一区二区三区视频| 999国产精品999久久久久久| 精品免费在线| 国产精品资源| 亚洲欧美在线综合| 国产视频一区三区| 99精品在线观看| 91青青国产在线观看精品| 国产日产高清欧美一区二区三区 | 秋霞国产精品| 精品91福利视频| 国产精品一区三区在线观看| 在线精品观看| 久久亚洲美女| 五月天久久777| 久久婷婷激情| 欧美13videosex性极品| 国产精品成人a在线观看| 美女毛片一区二区三区四区最新中文字幕亚洲 | 亚洲福利久久| 成人一区不卡| 国产一区二区三区四区五区 | 国产免费播放一区二区| 无码日韩精品一区二区免费| 蜜桃av一区二区| 在线亚洲欧美| 一本色道久久精品| 在线日韩电影| 91精品一区二区三区综合在线爱| аⅴ资源天堂资源库在线| 欧美日一区二区三区在线观看国产免 | 美女精品视频在线| 国产欧美另类| 国产精品极品在线观看| 奇米亚洲欧美| 国产精品一线| 欧美激情日韩| 精品视频一区二区三区在线观看| 欧美一区二区三区久久精品| 亚洲精品在线a| 美女精品网站| 综合激情网站| 日韩av中文字幕一区二区| 欧美一级一区| 老司机免费视频一区二区| 久久一区精品| 欧洲一区二区三区精品| 久久亚洲国产| 国产麻豆综合| 日韩精彩视频在线观看| 国产精品三p一区二区| 精品国产亚洲一区二区在线观看| 精品国产亚洲日本| 亚洲欧洲高清| 午夜久久影院| 日韩精品乱码av一区二区| 欧美色综合网| 国产精品久久久久久久久久10秀| 韩国精品主播一区二区在线观看 | 激情婷婷综合| 男人的天堂久久精品| 亚洲欧洲国产精品一区| 久久精品99国产精品日本| 国产日韩欧美高清免费| 国产成年精品| 亚洲国产一区二区在线观看| 日韩精品一二三| 国产精品久久久网站| 中文字幕在线官网| 在线午夜精品| 国产日韩在线观看视频| 国产va免费精品观看精品视频| 久久理论电影| 午夜性色一区二区三区免费视频| 欧美日韩va| 肉色欧美久久久久久久免费看| 合欧美一区二区三区| 日韩成人精品一区二区三区| 国产精品久久久一区二区| 精品亚洲美女网站| 欧美片网站免费| 久久av免费| 亚洲精品一区二区在线看| 国产精品中文| 国产精品欧美大片| www成人在线视频| 国产毛片久久久| 欧美日韩国产在线观看网站| 日本少妇一区| 国产一区二区三区久久 | 久久免费精品| 香蕉视频亚洲一级| 麻豆精品视频在线| 国产精品一区二区三区av| 高清一区二区| 日韩在线一区二区| 欧美国产视频| 极品裸体白嫩激情啪啪国产精品| 日韩一区二区三区免费视频| 国内精品美女在线观看| 久久国产精品亚洲77777| 久久99精品久久久野外观看| 香蕉久久99| 欧美伊人久久| 蜜臀国产一区| 亚洲我射av| 成人午夜在线| 一二三区精品| 理论片午夜视频在线观看| 亚洲免费一区三区| 成人在线视频中文字幕| 日韩激情中文字幕| jiujiure精品视频播放| 久久久久久亚洲精品美女| 在线免费观看亚洲| 欧美亚洲国产激情|