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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM