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