Spring容器刷新—00—整体流程

Spring容器刷新—00—整体流程整体流程总的来说,分为 12 个大步骤。本文只是概览。后续文章会对这个 12 个步骤进行详解。spring-容器初始化流程下文都是对上图中 12

大家好,欢迎来到IT知识分享网。

整体流程

总的来说,分为 12 个大步骤。本文只是概览。后续文章会对这个 12 个步骤进行详解。

Spring容器刷新—00—整体流程

spring-容器初始化流程

下文都是对上图中 12 个关键步骤的大体说明,由于篇幅原因,每个步骤的详情会在后续的文章中逐一说明。

1.prepareRefresh()

准备工作。

  • initPropertySources: 留给子类的空方法
  • validateRequiredProperties(): 验证 ConfigurablePropertyResolver#setRequiredProperties 指定的必须属性
  • earlyApplicationListeners: 处理容器中早期的事件(容器还没有创建,所以现在还没有 事件派发器 )

2.obtainFreshBeanFactory()

获取 BeanFactory 的实例。

默认是 new 了一个 DefaultListableBeanFactory。并返回 DefaultListableBeanFactory

3.prepareBeanFactory()

提前注册一些基础设施组件。

值得注意的是 ApplicationContextAwareProcessor、ApplicationListenerDetector、Environment 都是在这里注册的。

  • beanFactory.setBeanClassLoader(getClassLoader());
  • beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
  • beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
  • beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));

4.postProcessBeanFactory

留给子类的空方法。

到了这里,BeanFactory 的创建工作(标准初始化)就完成了。

5.invokeBeanFactoryPostProcessors

  • 回调 BeanDefinitionRegistryPostProcessor
  • 回调 BeanFactoryPostProcessor

6.registerBeanPostProcessors

注册各种 BeanPostProcessor

  • 普通的 BeanPostProcessor
  • InstantiationAwareBeanPostProcessor
  • SmartInstantiationAwareBeanPostProcessor
  • DestructionAwareBeanPostProcessor
  • MergedBeanDefinitionPostProcessor
  • 重新注册(Re-Register) ApplicationListenerDetector

7.initMessageSource

初始化 MessageSourcei18n 相关的基础组件。

8.initApplicationEventMulticaster

初始化事件派发器(ApplicationEventMulticaster)

  • 如果容器中已经有了 ApplicationEventMulticaster 类型的实例就直接使用
  • 否则就 new 一个 SimpleApplicationEventMulticaster 类型的 ApplicationEventMulticaster

9.onRefresh

留给子类的空方法

10.registerListeners

  • 注册一些静态的 listener (即getApplicationListeners() 的返回值)
  • 注册容器中的ApplicationListener(此处只依然是是通过 BeanName 注册(避免提早初始化))
  • 发布早期事件(直到现在才终于有了可用的事件派发器)

11.finishBeanFactoryInitialization

这部分的内容比较多: 单例 Bean 的初始化流程,涉及到Bean 的生命周期方法和 spring 提供的扩展组件的回调时机。后续会有单独文章来介绍这部分内容。

12.finishRefresh

  • clearResourceCaches(): 清理临时数据,比如扫描期间产生的 ASM 元数据
  • initLifecycleProcessor() 初始化LifecycleProcessor
    • 如果容器中已经有了 LifecycleProcessor 就直接使用
    • 否则 new 一个 DefaultLifecycleProcessor
  • getLifecycleProcessor().onRefresh(): 将 refresh 事件传播到上一步初始化好的 LifecycleProcessor 实例
  • publishEvent(new ContextRefreshedEvent(this)):发布 ContextRefreshedEvent 事件

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/60402.html

(0)
上一篇 2024-06-19 21:33
下一篇 2024-06-25 19:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信