Create
- 獲取SpringApplicationRunListener接口實現列表。讀取META-INF/spring.factories中配置的實現,默認:EventPublishingRunListener。獲取默認的監聽器以及從工廠中獲取ApplicationListener實現的bean並且支持當前類型的事件。回調監聽器listener.onApplicationEvent。默認監聽器如下圖:
- 回調SpringApplicationRunListener.environmentPrepared方法。即通知監聽器環境已準備完成。例如:ConfigFileApplicationListener監聽器接收事件後回調onApplicationEnvironmentPreparedEvent。然後回調EnvironmentPostProcessor.postProcessEnvironment
- 從應用上下文ConfigurableApplicationContext的類加載器中獲取FailureAnalyzer類型並創建FailureAnalyzer。如果FailureAnalyzer實現類是BeanFactoryAware類型,則回調setBeanFactory
- 獲取ApplicationContextInitializer接口實現列表。讀取META-INF/spring.factories中配置的實現。回調初始化方法initializer.initialize
- 回調SpringApplicationRunListener.contextPrepared方法。即上下文準備完成通知
- 回調SpringApplicationRunListener.contextLoaded。
- 回調SpringApplicationRunListener.contextLoaded。上下文加載完成(僅加載source,通常爲啓動時指定的Application類)
- 在上下文的子類中允許beanFactory的後置處理(會註冊一些默認的後置處理bean)
- 回調上下文中(add方法添加)的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry
- 回調工廠中的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry(按照排序優先級逐個調用,先回調實現了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor再處理實現了Ordered接口的BeanDefinitionRegistryPostProcessor,最後回調剩餘的)。回調剩餘BeanFactoryPostProcessor.postProcessBeanFactory方法(同時實現了BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor兩個接口的bean)
- 回調工廠中的BeanFactoryPostProcessor.postProcessBeanFactory方法(優先級:PriorityOrdered->Ordered->other)
- 註冊LoadTimeWeaverAwareProcessor後置處理至工廠
- 根據工廠中bean定義,獲取所有BeanPostProcessor類型定義的名稱,註冊攔截bean創建的後置處理器BeanPostProcessor至工廠(包含非單例)
- 註冊ApplicationListener監聽器(包含非單例)至ApplicationEventMulticaster。回調ApplicationListener.onApplicationEvent(如果存在earlyApplicationEvents消息)
- 回調InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法(如果返回bean非空,則說明初始化完成直接回調postAfter回調後返回當前bean)
- 回調BeanPostProcessor.postProcessAfterInitialization方法。如果上一步返回爲空則繼續。
- 回調SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors
- 回調MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition。此時bean(instanceWrapper)剛剛創建完成
- 回調SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference方法。此時bean還未完成初始化。
- 回調InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation方法
- 回調InstantiationAwareBeanPostProcessor.postProcessPropertyValues方法,注入屬性前回調
- 如果bean是BeanNameAware類型回調BeanNameAware.setBeanName
- 如果bean是BeanClassLoaderAware類型回調BeanClassLoaderAware.setBeanClassLoader
- 如果bean是BeanFactoryAware類型回調BeanFactoryAware.setBeanFactory
- 回調BeanPostProcessor.postProcessBeforeInitialization方法。調用bean的初始化方法前回調。回調PostConstruct註解的方法
- 如果bean是InitializingBean類型,回調InitializingBean.afterPropertiesSet。此時是在調用用戶的自定義init方法前
- 回調BeanPostProcessor.postProcessAfterInitialization方法
- 回調Lifecycle.start方法。LifecycleProcessor接口bean從工廠獲取LifecycleProcessor類型,名稱爲lifecycleProcessor的bean
- 廣播ContextRefreshedEvent事件
- 完成上下文刷新後爲上下文註冊鉤子registerShutdownHook。AbstractApplicationContext.registerShutdownHook方法。
- 完成上下文刷新後回調ApplicationRunner、CommandLineRunner.run方法
- 回調SpringApplicationRunListener.finished方法
Destroy
- doCreateBean完成時registerDisposableBeanIfNecessary方法中回調DestructionAwareBeanPostProcessor.requiresDestruction方法判斷是否需要註冊銷燬bean的適配bean
- 上下文完成刷新時添加了JDK回調用的shutdown鉤子關閉上下文
- 發佈ContextClosedEvent關閉事件
- 回調lifecycleProcessor.onClose方法
- 回調DisposableBean.destroy方法
- 回調DisposableBeanAdapter.destroy方法。
- 回調DestructionAwareBeanPostProcessor.postProcessBeforeDestruction方法
- 如果不是DisposableBean類型則回調bean的銷燬方法優先級:destroy配置的方法->close方法->shutdown方法->destroy方法
- 如果是web環境回調EmbeddedServletContainer.stop方法