0. 導讀
上一篇文章分析完了bean實例的創建,本文接着來講講bean實例的初始化結尾工作,主要介紹一下幾個方面。
populateBean()
:bean實例的屬性填充工作。autowireByName()
和autowireByType()
:兩種bean實例的注入方式。applyPropertyValues()
:對bean實例填充相關的屬性值。initializeBean()
:初始化bean實例。
1. 流程總覽
2.populateBean() 流程分析
3.autowireByName() 流程分析
4.autowireByType() 流程分析
5.applyPropertyValues() 流程分析
6.initializeBean() 流程分析
7.invokeInitMethods() 流程分析
8. 總結
關於上一篇和這篇源碼中,多次遇到了InstantiationAwareBeanPostProcessor
和SmartInstantiationAwareBeanPostProcessor
兩個類,以防大家混淆,在這裏特別說明一下。
類圖繼承關係如下:
關於兩個接口提供的方法說明。
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框架中是怎麼被運用的,敬請期待。
創作不易,白嫖點個再看,喜歡加個關注