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

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

spring源碼學習之bean的初始化以及循環引用

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

實例化方法,把bean實例化,并且包裝成BeanWrapper

1、點進這個方法里面。

spring源碼學習之bean的初始化以及循環引用

這個方法是反射調用類中的 factoryMethod 方法。 這要知道@Bean 方法的原理, 實際上spring 會掃描有@bean 注解的方法, 然后把方法名稱設置到 BeanDefinition 的 factoryMethod屬性中, 接下來就會調到上面截圖中的方法實現@Bean 方法的調用。

2、 有參構造函數的時候

spring源碼學習之bean的初始化以及循環引用

determineConstructorsFromBeanPostProcessors這個方法是 BeanPostProcessor 接口類的首次應用, 最終會掉到AutowiredAnnotationBeanPostProcessor 類的方法, 在方法中會掃描有注解的構造函數然后完成裝配過程。 然后把有有@Autowired 注解的構造函數返回。

3、 無參構造函數的實例化

spring源碼學習之bean的初始化以及循環引用

這就是簡單的反射實例化。 大部分類的實例化都會走這個邏輯

4、 類中注解的收集

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

注解的收集:

spring源碼學習之bean的初始化以及循環引用

也是通過 BeanPostProcessor 接口類型實例來挨個處理的。

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

這個類還對@PostConstruct 和@PreDestory 支持

spring源碼學習之bean的初始化以及循環引用

收集過程

1、 看緩存里面有沒有 InjectionMetadata 對象

2、 從類中獲取所有 Field 對象, 循環 field 對象, 判斷 field 有沒有@Resource 注解,如果有注解封裝成 ResourceElement 對象

3、 從類中獲取所有 Method 對象, 循環 Method 對象, 判斷 Method 有沒有@Resource

注解, 如果有注解封裝成 ResourceElement 對象

4、 最終把兩個 field 和 Method 封裝的對象集合封裝到 InjectionMetadata 對象中

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

5、 IOCDI 依

對應的方法:

spring源碼學習之bean的初始化以及循環引用

spring源碼學習之bean的初始化以及循環引用

這里又是一個 BeanPostProcessor 類型接口的運用, 前面我們講到了@Resource@Autowired 注解的收集, 那么這個方法就是根據收集到的注解進行反射調用。

spring源碼學習之bean的初始化以及循環引用

循環收集到的 metaData 中的 list 對象, 然后挨個調用里面的 InjectedElement 的inject 方法完成依賴注入。

spring源碼學習之bean的初始化以及循環引用

其中 value 值的獲取, 如果依賴的屬性是一個引用類型必定會觸發該屬性的BeanFactory.getBean 操作, 從而從 spring 容器中獲取到對應的實例。 方法的依賴注入類似這里就不再贅述。

6、 bean 實例化后的操作

代碼走到這里:

spring源碼學習之bean的初始化以及循環引用

A、 首先是對某些 Aware 接口的調用

spring源碼學習之bean的初始化以及循環引用

B、 然后@PostConstruct 注解方法的調用

spring源碼學習之bean的初始化以及循環引用

這里又是一個 BeanPostProcessor 接口的運用,前面講過, 有@PostConstruct 注解的方法會收集到一個 met就是通過 BeanPostProcessor 接口調到CommonAnnotationBeanPostProcessor 類, 然后在類中拿根據對象里面的容器來反射調用有注解的方法。 代碼如下:

spring源碼學習之bean的初始化以及循環引用

spring源碼學習之bean的初始化以及循環引用

有@PostConstruct 注解的容器會收集到 initMethods 容器中, 接下來就是方法的

反射調用。

spring源碼學習之bean的初始化以及循環引用

C、 InitializingBean 接口和 init-method 屬性調用

spring源碼學習之bean的初始化以及循環引用

Init-method 屬性調用是在 afterPropertiesSet 之后

spring源碼學習之bean的初始化以及循環引用

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

在這個方法里面還有一個重要的邏輯

spring源碼學習之bean的初始化以及循環引用

也是一個 BeanPostProcessor 接口的運用, 在這里會返回 bean 的代理實例, 這個就是 AOP 的入口。

D、 FactoryBean 接口

帶入如下:

spring源碼學習之bean的初始化以及循環引用

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

spring源碼學習之bean的初始化以及循環引用

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

getObject方法返回的實例會有單獨的緩存存儲, 跟其他實例不是同一個緩存, 對應的緩存是:factoryBeanObjectCache

E、 循環依賴

循環依賴請參照流程圖理解https://www.processon.com/view/link/5df9ce52e4b0c4255ea1a84f

循環依賴只會出現在單例實例無參構造函數實例化情況下

有參構造函數的加@Autowired 的方式循環依賴是直接報錯的, 多例的循環依賴也是直接報錯的

spring源碼學習之bean的初始化以及循環引用

spring源碼學習之bean的初始化以及循環引用

循環依賴步驟:

1、 A 類無參構造函數實例化后, 設置三級緩存

2、 A 類 populateBean 進行依賴注入, 這里觸發了 B 類屬性的 getBean 操作

3、 B 類無參構造函數實例化后, 設置三級緩存

4、 B 類 populateBean 進行依賴注入, 這里觸發了 A 類屬性的 getBean 操作

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

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

7、 B 類實例化已經完成, B 類的實例化是由 A 類實例化中 B 屬性的依賴注入觸發的 getBean 操作進行的, 現在 B 已經實例化, 所以 A 類中 B 屬性就可以完成依賴注入了, 這時候 A 類 B 屬性已經有值了

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

總結

到此這篇關于spring源碼學習之bean的初始化以及循環引用的文章就介紹到這了,更多相關spring源碼bean的初始化及循環引用內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区导航| 国产精品久一| 色婷婷精品视频| 日韩黄色大片| 欧美精品日日操| 日韩在线综合| 欧美日韩中文一区二区| 99久久精品网| 国产亚洲午夜| 日本中文字幕不卡| 久久精品xxxxx| 国产一区二区三区免费在线| 久久这里只有| 日韩一区二区中文| 红桃视频国产一区| 日本不卡视频在线观看| 国产精品亚洲四区在线观看 | 亚洲麻豆一区| 青青草精品视频| 欧美国产免费| 日韩网站中文字幕| 日韩中文字幕一区二区三区| 日韩中文av| 久久国内精品| 精品国产网站| 欧美成人综合| 免费高清在线一区| 国产精品任我爽爆在线播放 | 免费av一区| 亚洲91在线| 久久精品理论片| 青青久久av| 亚洲v天堂v手机在线| 国产日本精品| 国产精品亚洲一区二区三区在线观看| 99视频精品免费观看| 亚洲欧美日本国产| 国产一区二区三区亚洲| 午夜精品免费| 国产精品视频一区二区三区综合| 蜜臀久久精品| 亚洲麻豆一区| 女生影院久久| 亚洲免费毛片| 国产一区二区三区四区二区| 亚洲欧美不卡| 国际精品欧美精品| 伊人久久大香线蕉av超碰演员| 四虎国产精品免费久久| 日本一二区不卡| 日欧美一区二区| 成人高清一区| 在线观看视频免费一区二区三区| 欧美在线精品一区| 激情久久中文字幕| 亚洲+小说+欧美+激情+另类| 国产精选在线| 日日夜夜免费精品视频| 亚洲性色av| 欧美日韩99| 99日韩精品| 亚洲三级欧美| 91精品丝袜国产高跟在线| 欧美综合另类| 美女精品视频在线| 亚洲欧美日本国产专区一区| 国产精品三级| 久久亚洲影院| 日本在线高清| 国产亚洲字幕| 亚洲在线电影| 精品三级久久| 国产精品va视频| 亚洲网址在线观看| 少妇久久久久| 麻豆精品av| 日本免费新一区视频| 午夜av一区| 97精品中文字幕| 国产日产一区| 午夜在线一区| 精精国产xxxx视频在线野外| 国产精品免费精品自在线观看| 奶水喷射视频一区| 亚洲高清久久| 日本久久黄色| 欧美激情福利| 日韩成人午夜精品| 丝袜a∨在线一区二区三区不卡| 久久在线电影| 天堂中文在线播放| 精品久久视频| 国产精久久久| 亚洲精品韩国| 亚洲专区欧美专区| 99精品一区| 国产成人精品一区二区免费看京 | 日韩中文一区二区| 在线亚洲免费| 欧美午夜精品一区二区三区电影| 国产不卡精品| 免费在线欧美黄色| 国产欧美另类| 日韩av影院| 综合一区av| 三级在线观看一区二区| 在线观看免费一区二区| 色老板在线视频一区二区| 97精品中文字幕| 69精品国产久热在线观看| 亚洲精选91| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美成人高清| 欧美日韩国产一区二区三区不卡| 欧洲av一区二区| 日韩精品影视| 欧美影院三区| 亚洲欧美日韩高清在线| 国产高清一区| 自拍日韩欧美| 久久av一区二区三区| 亚洲国产一区二区在线观看 | 亚洲欧洲一区| 怡红院精品视频在线观看极品| 日韩午夜一区| 先锋影音久久久| 美国三级日本三级久久99| 亚洲久草在线| 国产一级成人av| 久久久国产精品网站| 国产传媒在线| 91精品一区二区三区综合| 黄色成人91| 蜜桃视频在线观看一区二区| 日韩一区二区三免费高清在线观看 | 久久精品免费一区二区三区| 久久高清免费| 亚洲免费影视| 青青草国产精品亚洲专区无| 欧美激情视频一区二区三区在线播放| 久久精品三级| 欧美一级鲁丝片| 午夜精品一区二区三区国产| 中文字幕日本一区| 久久国内精品| 国产不卡一区| re久久精品视频| 男女精品网站| 国产九九精品| 日韩国产欧美| 视频一区二区中文字幕| 日韩精品视频在线看| 卡一卡二国产精品| 伊人久久大香线蕉av不卡| 综合国产视频| 精品久久99| 欧美一区二区三区高清视频| 亚洲涩涩av| 精品免费av| 欧美+日本+国产+在线a∨观看| 香蕉久久一区| 国产成人调教视频在线观看| 蜜臀91精品国产高清在线观看| 亚洲综合福利| 国产一区二区精品久| 亚洲一区二区三区高清不卡| 国产精品亚洲欧美| 欧美丝袜一区| 久久国产三级| 激情婷婷亚洲| 91精品福利观看| 中文一区一区三区高中清不卡免费| 欧美aa国产视频| 国产日韩在线观看视频| 久久久亚洲一区| 日韩不卡一二三区| 久久久久国产| 欧美久久香蕉| 成人羞羞在线观看网站| 亚洲精品国产日韩| 四虎8848精品成人免费网站| 日韩在线播放一区二区| 亚洲3区在线| 丝袜美腿诱惑一区二区三区 | 国产精品亚洲片在线播放| 欧美日韩水蜜桃| 国产探花一区| 黄色av日韩| 精品国产99| 日韩一区二区三区高清在线观看| 快播电影网址老女人久久| 日韩av一级片| 不卡一区综合视频| 美女性感视频久久| 亚洲欧美不卡| 亚洲日本网址| 国产精品日本一区二区不卡视频 | 一区二区三区四区日韩| 亚洲人成在线网站| 久久av免费看|