project/spring/spring源码解读/spring02刷新.md

89 lines
2.2 KiB
Markdown
Raw Normal View History

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