# 第二章刷新 synchronized使用当前类中final对象。 ## 获取启动指标StartupStep ```java StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh"); ``` ## 刷新前预处理prepareRefresh() 1. 记录启动时间 2. 设置当前状态未关闭 3. 设置当前状态活跃 4. 初始化上下文资源中的占位符,initPropertySources(); 5. 校验上下文可解析,getEnvironment().validateRequiredProperties(); 6. 初始化监听器earlyApplicationListeners(LinkedHashSet) 7. 初始化事件earlyApplicationEvents(LinkedHashSet) ## 刷新内部类obtainFreshBeanFactory() 1. 刷新工厂refreshBeanFactory() 1. 销毁类 2. 关闭工厂 3. 创建新的工厂 4. 设置工厂customizeBeanFactory序列化类名加对象十六进制,弱引用。 5. 定制工厂设置是否可重写,是否可循环引用 6. 加载工厂loadBeanDefinitions,XmlBeanDefinitionReader 2. 返回工厂getBeanFactory() ## 装配工厂prepareBeanFactory 1. 设置加载类 2. 是否支持spel 3. 设置Property编辑器 4. 设置类后置处理器(post processor)BeanPostProcessor,添加感知处理器AwareProcessor 5. 忽略加载的其他感知接口 6. 注册解析接口:BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext 7. 添加后置处理器ApplicationListenerDetector内部类检测 8. 图片设置 9. 加载环境中的配置信息 ## 内部类处理配置postProcessBeanFactory(beanFactory); ## 设置启动步骤spring.context.beans.post-process ## 将工厂注册为bean,invokeBeanFactoryPostProcessors(beanFactory) ## 注册工厂bean,registerBeanPostProcessors(beanFactory) ## 启动步骤spring.context.beans.post-process完成 ## 初始化message source,initMessageSource() ## 初始化事件多播器initApplicationEventMulticaster() ## onRefresh() ## 注册监听器registerListeners() ## 初始化剩余信息finishBeanFactoryInitialization(beanFactory) ## 完成刷新 1. 清空资源缓存 2. 初始化生命周期处理器 3. 启动生命周期 4. 发布事件 5. NativeDetector ## 异常处理 1. 销毁之前创建的单例 2. 设置活跃状态为false 3. 抛出异常 ## finally 1. 清空缓存 2. 结束spring.context.refresh