Spring 源碼 (1)Spring IOC Bean 創建的整體流程

Spring IOC 中涉及的重要介面

  • BeanDefinition
    Bean的描述資訊,實現類包括 RootBeanDefinitionGenericBeanDefinition,Bean的描述資訊中定義了一系列Bean的資訊,比如:beanClassNamescopelazyinitdependsOnprimaryinitMethodNamedestroyMethodNameisSingtonisAbstract等資訊。

  • BeanDefinitionReader

    用於解析Bean的資源閱讀器,比如針對於XML文件的配置的Bean,實現類XmlBeanDefinitionReader,針對properties文件的配置的Bean,實現類為PropertiesBeanDefinitionReaderSpring在啟動時會將xml文件通過loadBeanDefinitions方法進行解析。

  • BeanFactory
    IOC容器實現的頂層介面,默認的實現為DefaultListableBeanFactorySpring Bean 的整個生命周期都是由DefaultListableBeanFactory去管理的,這個類非常的重要

  • BeanFactoryPostProcessor

    這個介面是BeanFactory的增強處理器,用於在Bean載入為BeanDefinition之後的擴展,比如實現類PlaceHolderConfigurerSupport 就是用來處理佔位符解析的,當我在xml文件中配置jdbc資訊的時候,通過是用${xxx.jdbUrl}這種方式配置資料庫連接的時候,就是通過這個類來處理和解析的。

  • Aware

    這個介面,他下面有一堆的子介面,比如BeanNameAwareApplicationContextAwareBeanFactoryAwareEnvironmentAware等,可以通過實現這些介面完成ioc容器中特定資訊的設置,比如EnvironmentAware,可以在Bean創建過程中設置環境資訊到對應的Bean對象中,後期通過bean對象獲取環境資訊數據。

  • BeanPostProcessor

    這個介面是Bean的增強處理器,用於在Bean進行初始化時調用init-method方法的前後進行增強,他有兩個方法:postProcessBeforeInitializationpostProcessAfterInitialization,分別用於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創建的細節解讀。