Spring源碼閱讀之初始化"非懶加載bean"實例-第4篇

0. 導讀

上一篇文章分析完了bean實例的創建,本文接着來講講bean實例的初始化結尾工作,主要介紹一下幾個方面。

  1. populateBean():bean實例的屬性填充工作。

  2. autowireByName()autowireByType():兩種bean實例的注入方式。

  3. applyPropertyValues():對bean實例填充相關的屬性值。

  4. initializeBean():初始化bean實例。

1. 流程總覽

2.populateBean() 流程分析

3.autowireByName() 流程分析

autowireByName流程

4.autowireByType() 流程分析

autowireByType流程

5.applyPropertyValues() 流程分析

applyPropertyValues流程

6.initializeBean() 流程分析

initializeBean流程

7.invokeInitMethods() 流程分析

invokeInitMethods流程

8. 總結

關於上一篇和這篇源碼中,多次遇到了InstantiationAwareBeanPostProcessorSmartInstantiationAwareBeanPostProcessor兩個類,以防大家混淆,在這裏特別說明一下。

  • 類圖繼承關係如下:

  • 關於兩個接口提供的方法說明。

  1. InstantiationAwareBeanPostProcessor接口方法說明

  • postProcessBeforeInstantiation():在bean實例創建前被調用,在這個時候可以使用動態代理創建bean實例等操作。

  • postProcessAfterInstantiation():在bean實例創建後,屬性設置前被調用,給出機會修改bean實例的狀態。

  • postProcessPropertyValues():主要作用是在設置屬性前,用於修改屬性值。

  • SmartInstantiationAwareBeanPostProcessor接口方法說明

    • predictBeanType():預測beanName對應的Class屬性是否爲指定的Class,如果是返回Class屬性,反之返回null。

    • determineCandidateConstructors():如果beanName對應的Class有多個構造器,則通過該方法來確定使用哪個構造器來創建bean實例,如果沒有指定構造器,則使用默認的構造器來創建bean實例。

    • getEarlyBeanReference():獲取提前暴露的bean實例的引用,該方法主要用於解決scope類型爲singleton的bean實例創建時面臨的循環依賴問題。只有singleton的bean實例創建纔會調用該方法。

    到此,BeanDefinition定義解析和bean實例的初始化流程基本上就圓滿完成了。下一篇我們開始一個新的概念,AOP思想在Spring框架中是怎麼被運用的,敬請期待。


    創作不易,白嫖點個再看,喜歡加個關注

    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章