Spring回調總結

Create

  1. 獲取SpringApplicationRunListener接口實現列表。讀取META-INF/spring.factories中配置的實現,默認:EventPublishingRunListener。獲取默認的監聽器以及從工廠中獲取ApplicationListener實現的bean並且支持當前類型的事件。回調監聽器listener.onApplicationEvent。默認監聽器如下圖:在這裏插入圖片描述
  2. 回調SpringApplicationRunListener.environmentPrepared方法。即通知監聽器環境已準備完成。例如:ConfigFileApplicationListener監聽器接收事件後回調onApplicationEnvironmentPreparedEvent。然後回調EnvironmentPostProcessor.postProcessEnvironment
  3. 從應用上下文ConfigurableApplicationContext的類加載器中獲取FailureAnalyzer類型並創建FailureAnalyzer。如果FailureAnalyzer實現類是BeanFactoryAware類型,則回調setBeanFactory
  4. 獲取ApplicationContextInitializer接口實現列表。讀取META-INF/spring.factories中配置的實現。回調初始化方法initializer.initialize
  5. 回調SpringApplicationRunListener.contextPrepared方法。即上下文準備完成通知
  6. 回調SpringApplicationRunListener.contextLoaded。
  7. 回調SpringApplicationRunListener.contextLoaded。上下文加載完成(僅加載source,通常爲啓動時指定的Application類)
  8. 在上下文的子類中允許beanFactory的後置處理(會註冊一些默認的後置處理bean)
  9. 回調上下文中(add方法添加)的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry
  10. 回調工廠中的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry(按照排序優先級逐個調用,先回調實現了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor再處理實現了Ordered接口的BeanDefinitionRegistryPostProcessor,最後回調剩餘的)。回調剩餘BeanFactoryPostProcessor.postProcessBeanFactory方法(同時實現了BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor兩個接口的bean)
  11. 回調工廠中的BeanFactoryPostProcessor.postProcessBeanFactory方法(優先級:PriorityOrdered->Ordered->other)
  12. 註冊LoadTimeWeaverAwareProcessor後置處理至工廠
  13. 根據工廠中bean定義,獲取所有BeanPostProcessor類型定義的名稱,註冊攔截bean創建的後置處理器BeanPostProcessor至工廠(包含非單例)
  14. 註冊ApplicationListener監聽器(包含非單例)至ApplicationEventMulticaster。回調ApplicationListener.onApplicationEvent(如果存在earlyApplicationEvents消息)
  15. 回調InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法(如果返回bean非空,則說明初始化完成直接回調postAfter回調後返回當前bean)
  16. 回調BeanPostProcessor.postProcessAfterInitialization方法。如果上一步返回爲空則繼續。
  17. 回調SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors
  18. 回調MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition。此時bean(instanceWrapper)剛剛創建完成
  19. 回調SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference方法。此時bean還未完成初始化。
  20. 回調InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation方法
  21. 回調InstantiationAwareBeanPostProcessor.postProcessPropertyValues方法,注入屬性前回調
  22. 如果bean是BeanNameAware類型回調BeanNameAware.setBeanName
  23. 如果bean是BeanClassLoaderAware類型回調BeanClassLoaderAware.setBeanClassLoader
  24. 如果bean是BeanFactoryAware類型回調BeanFactoryAware.setBeanFactory
  25. 回調BeanPostProcessor.postProcessBeforeInitialization方法。調用bean的初始化方法前回調。回調PostConstruct註解的方法
  26. 如果bean是InitializingBean類型,回調InitializingBean.afterPropertiesSet。此時是在調用用戶的自定義init方法前
  27. 回調BeanPostProcessor.postProcessAfterInitialization方法
  28. 回調Lifecycle.start方法。LifecycleProcessor接口bean從工廠獲取LifecycleProcessor類型,名稱爲lifecycleProcessor的bean
  29. 廣播ContextRefreshedEvent事件
  30. 完成上下文刷新後爲上下文註冊鉤子registerShutdownHook。AbstractApplicationContext.registerShutdownHook方法。
  31. 完成上下文刷新後回調ApplicationRunner、CommandLineRunner.run方法
  32. 回調SpringApplicationRunListener.finished方法

Destroy

  1. doCreateBean完成時registerDisposableBeanIfNecessary方法中回調DestructionAwareBeanPostProcessor.requiresDestruction方法判斷是否需要註冊銷燬bean的適配bean
  2. 上下文完成刷新時添加了JDK回調用的shutdown鉤子關閉上下文
  3. 發佈ContextClosedEvent關閉事件
  4. 回調lifecycleProcessor.onClose方法
  5. 回調DisposableBean.destroy方法
  6. 回調DisposableBeanAdapter.destroy方法。
  7. 回調DestructionAwareBeanPostProcessor.postProcessBeforeDestruction方法
  8. 如果不是DisposableBean類型則回調bean的銷燬方法優先級:destroy配置的方法->close方法->shutdown方法->destroy方法
  9. 如果是web環境回調EmbeddedServletContainer.stop方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章