Spring源碼分析-bean創建(流程圖)


bean的生命周期把它總結為以下幾個階段
  • 實例化
  • 屬性注入/依賴注入
  • 初始化
  • 銷毀
其中實例化、屬性注入、初始化屬於bean創建的過程。

bean創建的過程流程圖
(1)當spring容器在啟動的時候或者啟動完成后顯示調用getBean方法時來獲取bean實例的時候,都會調用這個doGetBean方法
  • doGetBean方法首先通過調用getSingleton判斷這個bean能不能拿到,如果可以直接返回;
  • doGetBean會根據不同的作用域,執行不同的操作
 
(2)Bean的創建,主要是通過調用doCreateBean方法
  1. 實例化,調用createBeanInstance方法
  2. 屬性注入,調用populateBean方法
  3. 初始化,調用initializeBean方法
 
(3)實例化,主要是通過調用createBeanInstance,又分兩步:
  1. 通過resolveBeanClass獲取beanClass對象,如果此類之前加載過直接返回,如果沒有加載過則通過ClassLoader加載;
  2. 實例化,通過無參構造方式實例化或通過@Autowire注解的構造方法實例化
 
(4)屬性注入,主要是通過調用populateBean方法
  1. 通過AutowiredFieldElement或AutowiredMethodElement調用inject方法
  2. bean注入最終又會調用getBean方法(循環依賴產生的地方)
  3. 拿到bean對象后,通過反射完成屬性注入
 
(5)初始化,主要是通過調用initializeBean方法(初始化東西最多)
         5.1 調用實現Aware接口的方法:
  • 調用 BeanNameAware 的 setBeanName 方法
  • 調用 BeanClassLoaderAware 的 setBeanClassLoader
  • 調用 BeanFactoryAware 的 setBeanFactory 方法
        5.2 執行 BeanPostProcessor 的預初始化方法
  • 調用 EnvironmentAware 的 setEnvironment 方法
  • 調用 EmbeddedValueResolverAware 的 setEmbeddedValueResolver 方法
  • 調用 ResourceLoaderAware 的 setResourceLoader 方法
  • 調用 ApplicationEventPublisherAware 的 setApplicationEventPublisher 方法
  • 調用 MessageSourceAware 的 setMessageSource 方法
  • 調用 ApplicationContextAware 的 setApplicationContext 方法
  • 調用 BeanPostProcessor 的預初始化方法
       5.3 調用普通初始化方法  
  • 調用 afterPropertiesSet 方法
  • 調用 用戶定義的初始化方法,即init-method 屬性配置的方法
注意:上面初始化方法從上至少是按照順序執行的


免責聲明!

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



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