(四)SpringBoot啟動過程的分析-預處理ApplicationContext
阿新 • • 發佈:2021-03-26
-- 以下內容均基於2.1.8.RELEASE版本
緊接著上一篇[(三)SpringBoot啟動過程的分析-建立應用程式上下文](https://www.cnblogs.com/lukama/p/14525282.html),本文將分析上下文建立完畢之後的下一步操作:預處理上下文容器。
## 預處理上下文容器
預處理上下文容器由prepareContext()方法完成,本篇內容全部都是基於這個方法所涉及的內容進行分析。
```
// SpringApplication.java
private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment, SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments, Banner printedBanner) {
// 設定環境物件,傳入的物件是解析完畢profiles的物件,Context內部則是不完整的物件
context.setEnvironment(environment);
// 設定上下文引數
postProcessApplicationContext(context);
// 載入ApplicationContextInitializers
applyInitializers(context);
// 觸發開始準備上下文事件
listeners.contextPrepared(context);
if (this.logStartupInfo) {
logStartupInfo(context.getParent() == null);
logStartupProfileInfo(context);
}
// 將啟動引數包裝為名為springApplicationArguments的DefaultApplicationArguments物件,並以單例模式註冊
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
beanFactory.registerSingleton("springApplicationArguments", applicationArguments);
// 設定列印的Banner
if (printedBanner != null) {
beanFactory.registerSingleton("springBootBanner", printedBanner);
}
// 設定是否允許覆蓋BeanDefinition
if (beanFactory instanceof DefaultListableBeanFactory) {
((DefaultListableBeanFactory) beanFactory).setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
}
// 載入資源
Set