Spring源碼解讀,Spring IOC 創建Bean的流程 ...
Spring IOC
中涉及的重要介面
-
BeanDefinition
Bean
的描述信息,實現類包括RootBeanDefinition
和GenericBeanDefinition
,Bean的描述信息中定義了一系列Bean的信息,比如:beanClassName
、scope
、lazyinit
、dependsOn
、primary
、initMethodName
、destroyMethodName
、isSington
、isAbstract
等信息。 -
BeanDefinitionReader
用於解析
Bean
的資源閱讀器,比如針對於XML
文件的配置的Bean
,實現類XmlBeanDefinitionReader
,針對properties
文件的配置的Bean
,實現類為PropertiesBeanDefinitionReader
,Spring
在啟動時會將xml
文件通過loadBeanDefinitions
方法進行解析。 -
BeanFactory
是IOC
容器實現的頂層介面,預設的實現為DefaultListableBeanFactory
,Spring Bean
的整個生命周期都是由DefaultListableBeanFactory
去管理的,這個類非常的重要。 -
BeanFactoryPostProcessor
這個介面是
BeanFactory
的增強處理器,用於在Bean
載入為BeanDefinition
之後的擴展,比如實現類PlaceHolderConfigurerSupport
就是用來處理占位符解析的,當我在xml
文件中配置jdbc
信息的時候,通過是用${xxx.jdbUrl}
這種方式配置資料庫連接的時候,就是通過這個類來處理和解析的。 -
Aware
這個介面,他下麵有一堆的子介面,比如
BeanNameAware
、ApplicationContextAware
、BeanFactoryAware
、EnvironmentAware
等,可以通過實現這些介面完成ioc
容器中特定信息的設置,比如EnvironmentAware
,可以在Bean
創建過程中設置環境信息到對應的Bean
對象中,後期通過bean
對象獲取環境信息數據。 -
BeanPostProcessor
這個介面是
Bean
的增強處理器,用於在Bean
進行初始化時調用init-method
方法的前後進行增強,他有兩個方法:postProcessBeforeInitialization
和postProcessAfterInitialization
,分別用於bean
初始化方法init-method
之前和之後調用,當然還可以進行很多擴展,比如aop
就是通過postProcessAfterInitialization
方法中去創建動態代理對象。
Spring Bean
的生命周期
- 首先通過BeanDefinitionReader將xml中的Bean配置載入到BeanDefinition中
- 然後將BeanDefinition放入DefaultListableBeanFacotry的beanDefinitionMap和beanDefinitionNames集合中
- 然後調用BeanFactoryPostProcessor#postProcessorBeanFactory對容器中的BeanDefinition的屬性進行增強解析
- 然後通過反射調用對象的構造函數進行對象的實例化
- 然後調用populateBean進行屬性填充
- 然後調用初始化方法initializeBean,初始化時又會先調用invokeAwareMethods方法執行一堆的Aware方法
- 然後BeanPostProcessor#postProcessBeforeInitialization方法執行bean增強器的前置處理
- 然後調用InitializingBean#afterPropertiesSet方法或者是調用自定義的init-method方法
- 然後調用BeanPostProcessor#postProcessAfterInitialization方法執行bean增強的後置處理
- 最後完成Bean的創建,最終放入一級緩存singletonObjects中
整體流程大概就是這個,有了整體流程就可以進行下一步Bean創建的細節解讀。