Springboot/Spring總結

1.構造SpringApplication對象

    1. 推測web應用類型this.webApplicationType(NONE、REACTIVE、SERVLET)
  • 2.從spring.factories中獲取BootstrapRegistryInitializer對象this.bootstrapRegistryInitializers
  • 3.從spring.factories中獲取ApplicationContextInitializer對象this.initializers
  • 4.從spring.factories中獲取ApplicationListener對象this.listeners
  • 5.推測出Main類(main()方法所在的類)this.mainApplicationClass

2.SpringApplication#run:發佈ApplicationStartingEvent

  • 6.從spring.factories中獲取SpringApplicationRunListener對象。默認會拿到一個EventPublishingRunListener,它會啓動過程的各個階段發佈對應的ApplicationEvent事件

  • 7.listeners.starting(bootstrapContext, this.mainApplicationClass);發佈ApplicationStartingEvent

3.SpringApplication#run:獲取各種配置參數

  • 8.將run()的參數封裝爲DefaultApplicationArguments對象

    1. ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);準備Environment:包括操作系統,JVM、ServletContext、properties、yaml等等配置,會發佈一個ApplicationEnvironmentPreparedEvent

4.SpringApplication#run:根據應用類型創建Spring容器

  • 10.context = createApplicationContext();

5.SpringApplication#run:prepareContext

  • 11.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
    1)利用ApplicationContextInitializer初始化Spring容器
    2)發佈ApplicationContextInitializedEvent
    3)關閉DefaultBootstrapContext
    4)註冊primarySources類,就是run方法存入進來的配置類
    5)發佈ApplicationPreparedEvent事件

6.SpringApplication#run:refreshContext

  • 12.refreshContext(context);刷新Spring容器,會解析配置類、掃描、啓動WebServer、創建單例非懶加載的Bean

6.1 prepareRefresh();

  • initPropertySources();留給子類擴展
  • getEnvironment().validateRequiredProperties();校驗必須有的環境變量

6.2 beanFactory = obtainFreshBeanFactory();

  • refreshBeanFactory();
  • getBeanFactory();

6.3 prepareBeanFactory(beanFactory);

  • 給當前beanFactory設置一個類加載器,用於加載bd的class信息。
  • 設置Spring EL 表達式解析器StandardBeanExpressionResolver
  • 爲propertyEditorRegistrars添加ResourceEditorRegistrar。BeanWrapper 本身就是屬性編輯器註冊中心,屬性編輯器作用於beanWrapper內部管理的真實bean注入字段值時,當某個字段對應的類型 在 BeanWrapper內 有對應的屬性編輯器,那麼對應類型的字段值 就由該屬性編輯器 代理寫入。
  • 添加BeanPostProcessor實例:ApplicationContextAwareProcessor
  • 忽略指定類型的依賴:EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware,統一放在上面的ApplicationContextAwareProcessor裏面處理
  • 添加BeanPostProcessor實例:ApplicationListenerDetector(初始化後: 判斷當前創建出來的bean實例 是否是 實現了 ApplicationListener 接口的 實例,如果是,當前bean就是一個 事件監聽器 對象,需要把監聽者註冊到容器中。)
  • 註冊單例:StandardEnvironment、systemEnvironment、systemProperties

6.4 postProcessBeanFactory(beanFactory);

留給子類實現

6.5 invokeBeanFactoryPostProcessors(beanFactory);

  • 1)執行通過ApplicationContext添加進來的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法
  • 2)執行BeanFactory中實現了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法
  • 3.)執行BeanFactory中實現了Ordered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法
  • 4)執行BeanFactory中其他的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法
  • 5)執行上面所有的BeanDefinitionRegistryPostProcessor的postProcessBeanFactory()方法
  • 6)執行通過ApplicationContext添加進來的BeanFactoryPostProcessor的postProcessBeanFactory()方法
  • 7)執行BeanFactory中實現了PriorityOrdered接口的BeanFactoryPostProcessor的postProcessBeanFactory()方法
  • 8)執行BeanFactory中實現了Ordered接口的BeanFactoryPostProcessor的postProcessBeanFactory()方法
  • 9)執行BeanFactory中其他的BeanFactoryPostProcessor的postProcessBeanFactory()方法

6.6 registerBeanPostProcessors(beanFactory);

  • 1.註冊實現PriorityOrdered接口的BeanPostProcessors
  • 2.註冊實現Ordered接口的BeanPostProcessors
  • 3.註冊普通的BeanPostProcessors
  • 4.重新註冊所有MergedBeanDefinitionPostProcessor
  • 5.最後再註冊ApplicationListenerDetector

6.7 initMessageSource();

6.8 initApplicationEventMulticaster();

  • this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory); 初始化事件發佈器

6.9 onRefresh();

6.10 registerListeners();

將ApplicationListener加入到事件發佈器裏面。

從BeanFactory中獲取ApplicationListener類型的beanName,然後添加到ApplicationContext中的事件廣播器applicationEventMulticaster中去,到這一步因爲FactoryBean還沒有調用getObject()方法生成Bean對象,所以這裏要在根據類型找一下ApplicationListener,記錄一下對應的beanName

6.11 finishBeanFactoryInitialization(beanFactory);

  • 實例化非抽象、非懶加載的單例Bean:getBean(beanName)
  • 如果是FactoryBean,則先獲取FactoryBean實例本身getBean(& + beanName);
    如果FactoryBean是SmartFactoryBean ,並且isEagerInit爲true,則提前初始化FactoryBean管理的Bean:getBean(beanName)。

6.12 finishRefresh();

  • initLifecycleProcessor();設置this.lifecycleProcessor爲DefaultLifecycleProcessor
  • getLifecycleProcessor().onRefresh();
    autoStartupOnly爲true:表示只啓動 SmartLifecycle 生命週期對象,爲false表示全部啓動,包括普通的Lifecycle。
    根據phase值,對SmartLifecycle 對象分組,值越小,越先啓動。
  • 發佈ContextRefreshedEvent事件

7.SpringApplication#run:後置處理

  • 13.發佈ApplicationStartedEvent事件,表示Spring容器已經啓動
  • 14.從Spring容器中獲取ApplicationRunner和CommandLineRunner,並執行其run()
  • 15.發佈ApplicationReadyEvent事件,表示Spring容器已經準備好了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章