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創建的細節解讀。