整体流程 总的来说,分为 12 个大步骤。本文只是概览。后续文章会对这个 12 个步骤进行详解。 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 初始化 MessageSource , i18n 相关的基础组件。 8.initApplicationEventMulticaster 初始化事件派发器( ApplicationEventMulticaster ) 如果容器中已经有了 ApplicationEventMulticaster 类型的实例就直接使用 否则就 new 一个 SimpleApplicationEventMulticaster 类型的 ApplicationEventMulticaster 9.onRefresh 留给子类的空方法 10.registerListeners注册一些静态的 listener (即 getApplicationListeners() 的返回值) 注册容器中的 ApplicationListener (此处只依然是是通过 BeanName 注册(避免提早初始化)) 发布早期事件(直到现在才终于有了可用的事件派发器) 11.finishBeanFactoryInitialization 这部分的内容比较多: 单例 Bean 的初始化流程,涉及到Bean 的生命周期方法和 spring 提供的扩展组件的回调时机。后续会有单独文章来介绍这部分内容。 12.finishRefreshclearResourceCaches() : 清理临时数据,比如扫描期间产生的 ASM 元数据 initLifecycleProcessor() 初始化 LifecycleProcessor 如果容器中已经有了 LifecycleProcessor 就直接使用 否则 new 一个 DefaultLifecycleProcessor getLifecycleProcessor().onRefresh() : 将 refresh 事件传播到上一步初始化好的 LifecycleProcessor 实例 publishEvent(new ContextRefreshedEvent(this)) :发布 ContextRefreshedEvent 事件