# 第二章刷新

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







