1、Bean的初始化流程:
在springboot啟動這個環節,圍繞着bean實例化這個主題,簡單的了解下,到底spring是如何把我們的配置變量,生成對應的容器實例:
大概的流程是
1、初始化構造器(Initialize),不同構造器會有不同分工,細節在下一章節詳細說明
2、初始化監聽器,不同的代碼塊會觸發不同的事件,每個事件監聽器持有該監聽器要負責的事件類型,並通過事件類型,決定到底要不要執行該事件,以及對應的處理邏輯
3、初始化環境變量Environment, 這里的環境變量是系統級別的,也就是我們默認class文件路徑下的環境變量
4、加載Nacos配置文件:但是我們的bootstrap走的是nacos,需要通過Nacos客戶端方式,獲取對應的環境變量,在初始化構造器中加載nacos配置文件,大概是這個類NacosPropertySourceLocator,主要加載三種類型的配置:
NacosShareConfiguration:我們配置share的config
NacosExtensionConfiguration:擴展config
NacosApplicationConfiguration:應用級別的config,也就是在配置中心里的實體文件,加載Nacos配置中心變量,主要有三個加載邏輯:加載應用名的properties、應用名+“.”、 應用名+"-"+profile + .properties ,這一步我們的初始化環境變量基本完成
5、初始化Bean工廠BeanFactory : 包括:bean的表達式解析器、Aware組件、注冊環境變量
6、生成BeanDefinition:每個bean都會對應一個BeanDefinition,可以說是bean的元數據,但是這個時候,bean只是以BeanDefinition的形式存儲在應用上下文里,還沒有生成相關的實例
8、初始化bean處理器:處理器包括spring內部實現的以及外部插件自實現的
9、Configuration處理器:調用Configuration增強類,這一步是把被configuration注解標記的類,生成對應的代理類,並重置BeanDefinition的class屬性,所以每個被configuration標記的類,在容器中都是以代理類的形式存在
10、替換占位符:我們的類實例里的成員變量,注解會有占位符,需要把它替換成真實的值
11、排序bean處理器:三種類型 priority、Order、無序的
12、初始化和webservlet相關的bean : 實例化bean
13、初始化工廠bean
14、初始化其他類型的bean
此時,spring容器bean的實例化基本結束

2、Bean的創建過程:
通過構造器,找到構造器入參,並從容器內部找到對應Bean的實例,沒有則創建依賴的Bean,是一個循環的過程,調用鏈如下:
