大家好,欢迎来到IT知识分享网。
整体流程
总的来说,分为 12 个大步骤。本文只是概览。后续文章会对这个 12 个步骤进行详解。
下文都是对上图中 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
初始化 MessageSource,i18n 相关的基础组件。
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