所有初始化流程到包含在 (org.springframework.context.support) AbstractApplicationContext#refresh() 中:
@Overridepublic void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");// Step 1: 刷新预处理,不管之前有没有容器,现在都会清除掉重置信息// Prepare this context for refreshing.prepareRefresh();// Step 2: Spring 初始化 bean 工厂的流程// a) 创建 IoC 容器(DefaultListableBeanFactory)// b) 加载解析 XML 文件(最终存储到 Document 对象中)// c) 读取 Document 对象,并完成 BeanDefinition 的加载和注册工作// Tell the subclass to refresh the internal bean factory.ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// Step 3: 对 IoC 容器进行一些预处理(设置一些公共属性)// Prepare the bean factory for use in this context.prepareBeanFactory(beanFactory);try {// Step 4: 后置处理 bean 工厂,对 bean 工厂进行一些注册操作// Allows post-processing of the bean factory in context subclasses.postProcessBeanFactory(beanFactory);StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");// Step 5: 调用 BeanFactoryPostProcessor 后置处理器对 BeanDefinition 处理,发生在 bean 创建之前// Invoke factory processors registered as beans in the context.invokeBeanFactoryPostProcessors(beanFactory);// Step 6: 注册 BeanPostProcessor 后置处理器// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);beanPostProcess.end();// Step 7: 初始化一些消息源(比如处理国际化的 i18n 等消息源)// Initialize message source for this context.initMessageSource();// -------------------------------------- 基础容器中没有,只存在于高级容器中 -----------------------------------// Step 8:初始化应用事件广播器// Initialize event multicaster for this context.initApplicationEventMulticaster();// Step 9: 初始化一些特殊的 bean (内置 bean)// Initialize other special beans in specific context subclasses.onRefresh();// Step 10:注册一些监听器// Check for listener beans and register them.registerListeners();// -----------------------------------------------------------------------------------------------------// Step 11: 实例化剩余的单例 bean()非懒加载方式// 注意事项:Bean 的 IoC、DI 和 AOP 都是发生在此步骤// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);// Step 12: 完成刷新时,需要发布对外的事件// Last step: publish corresponding event.finishRefresh();}catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn("Exception encountered during context initialization - " +"cancelling refresh attempt: " + ex);}// Destroy already created singletons to avoid dangling resources.destroyBeans();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}finally {// Reset common introspection caches in Spring's core, since we// might not ever need metadata for singleton beans anymore...resetCommonCaches();contextRefresh.end();}}}
总结下来,共有 12 步:
- Step 1: 刷新预处理,不管之前有没有容器,现在都会清除掉重置信息
- Step 2: Spring 初始化 bean 工厂的流程
- Step 3: 对 IoC 容器进行一些预处理(设置一些公共属性)
- Step 4: 后置处理 bean 工厂,对 bean 工厂进行一些注册操作
- Step 5: 调用 BeanFactoryPostProcessor 后置处理器对 BeanDefinition 处理,发生在 bean 创建之前
- Step 6: 注册 BeanPostProcessor 后置处理器
- Step 7: 初始化一些消息源(比如处理国际化的 i18n 等消息源)
- Step 8:初始化应用事件广播器
- Step 9: 初始化一些特殊的 bean (内置 bean)
- Step 10:注册一些监听器
- Step 11: 实例化剩余的单例 bean()非懒加载方式
- Step 12: 完成刷新时,需要发布对外的事件
