1.構造SpringApplication對象
- 推測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對象
- 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容器已經準備好了