Spring回调总结

Create

  1. 获取SpringApplicationRunListener接口实现列表。读取META-INF/spring.factories中配置的实现,默认:EventPublishingRunListener。获取默认的监听器以及从工厂中获取ApplicationListener实现的bean并且支持当前类型的事件。回调监听器listener.onApplicationEvent。默认监听器如下图:在这里插入图片描述
  2. 回调SpringApplicationRunListener.environmentPrepared方法。即通知监听器环境已准备完成
  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方法
发布了91 篇原创文章 · 获赞 103 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/u010597819/article/details/105188026
今日推荐