Spring IOC Bean對象的創建總結 根據前面的介紹,可以進行Spring IOC容器創建Bean的總結: 調用構造函數啟動,調用過程中父類會忽略調用三個Aware介面,BeanNameAware,BeanClassloaderAware,BeanFactoryAware。 環境準備,Env ...
Spring IOC Bean對象的創建總結
根據前面的介紹,可以進行Spring IOC容器創建Bean的總結:
- 調用構造函數啟動,調用過程中父類會忽略調用三個
Aware
介面,BeanNameAware
,BeanClassloaderAware
,BeanFactoryAware
。 - 環境準備,
Environment
- 實現類
StandardEnvironment
,調用System.getenv()
獲取系統環境變數,比如配置的java
環境變數等,調用System.getProperties()
獲取到的系統屬性變數,比如當前系統的名稱,版本號等。
- 實現類
- 刷新容器,
AbstractApplicationContext#refresh
- 這個類是
BeanFactory
的實現類,refresh
方法是Spring IOC
容器啟動的關鍵 - 整個
IOC
容器的生命周期都是圍繞著這10幾個方法進行展開的
- 這個類是
- 創建
IOC
容器並載入BeanDefinition
,調用obtainBeanFactory
方法- 創建一個預設的
BeanFactory
,DefaultListableBeanFactory
- 載入
xml
中配置的Bean
對象,調用loadBeanDefinitions
方法 - 預設會創建一個
BeanDefinitionReader
進行讀取 - 創建解析器,用於
dtd
文件和xsd
文件的,預設會載入MATE-INF/spring.schemas
文件和MATE-INF/spring.handlers
文件 - 解析傳入的
xml
文件,解析過程中文件資源變化:String[] -->String --> Resource[] --> Resource
,不斷的調用重載的方法loadBeanDefinitions
,最終解析成Document
- 將解析的
Document
文件遍歷元素Element
,會解析兩種元素,一種是預設的,調用parseDefaultElement
,比如解析bean
標簽,另一種是定製的,調用parseCustomElement
,比如解析contex:compent-scan
,util:map
標簽等 - 解析完之後會創建一個
GenericBeanDefinition
放入beanDefinitionMap
和beanDefinitionNames
集合中
- 創建一個預設的
- 準備容器,調用
prepareBeanFactory
方法- 創建一個預設的
Spel
表達式解析器,StandardBeanExpressionResolver
- 添加一個屬性編輯器的註冊器,
ResourceEditorRegistrar
- 添加一個
BeanPostProcessor
實現類,ApplicationContextAwareProcessor
,用於執行6的忽略的Aware
介面 - 忽略6個
Aware
介面,EnvironmentAware
,EmbeddedValueResolverAware
,ResourceLoaderAware
,ApplicationEventPublisherAware
,MessageSourceAware
,ApplicationContextAware
- 創建一個預設的
- 執行
BeanFactoryPostProcessor
,調用invokeBeanFactoryPostProcessors
方法- 先解析傳入的
BFPP
介面實現類,在解析容器中的BFPP
- 先解析
BeanDefinitionRegistryPostProcessor
介面實現,在解析BeanFactoryPostProcessor
介面實現 - 解析到
BDRPP
,就直接調用postProcessBeanDefinitionRegistry
方法,使用集合分別存儲BDRPP
的介面和BFPP
的介面 - 解析時按照
PriorityOrdered
介面,Ordered
介面,無序的順序進行解析,執行也是按照這個順序執行 - 迴圈遍歷執行
BDRPP
介面方法postProcessBeanDefinitionRegistry
,BFPP
的方法postProcessBeanFactory
- 遍歷解析
BDRPP
時會執行到註解的解析類ConfigurationClassPostProcessor
- 解析
@Component
註解,解析@ComponentScans
、@ComponentScan
註解,解析@PropertySources
、@PropertySource
註解,解析@ImportResouce
註解,解析@Import
註解,解析@Bean
註解 - 解析完之後將解析到的
BeanDefinition
創建為GenericBeanDefinition
,然後加入到beanDefinitionMap
和beanDefinitionNames
集合中
- 解析
- 先解析傳入的
- 執行
BeanPostProcessor
的註冊,調用registerBeanPostProcessors
方法- 解析過程跟解析
BFPP
邏輯類似,只是BPP
只是進行了註冊,調用了addBeanPostProcessor
方法
- 解析過程跟解析
- 執行國際化設置,多播器設置,監聽器註冊
- 執行剩餘的非懶載入的單例的初始化,調用
finishBeanFactoryInitialization
方法- 載入一個轉換服務,
ConversionService
,用於類型轉換使用 - 添加一個預設的占位符解析器,
PropertySourcesPlaceHolderConfigurer
- 凍結
BeanDefinition
的元數據 - 實例化所有的非懶載入的單例
Bean
,調用preInstantiateSingletons
方法-
- 載入一個轉換服務,
未完待續。。。。