springboot IOC容器初始化流程
IOC容器的初始化是在 AbstractApplicationContext.run
中完成的。
在refresh
方法中主要做这几件事:
- 准备
BeanFactory
,会给BeanFactory
设置很多属性,如类加载器、Environment等。 - 执行
BeanFactoryPostPresser
(后置处理器),这一阶段会扫描要放入容器中的Bean信息,得到对应的。BeanDefinition
(只扫描,不创建)。 - 注册
BeanPostProsser
。 - 启动
tomcat
。 - 实例化容器中非懒加载的单例Bean。
- 容器初始化完成后做一些收尾工作,如清除缓存等。
在IOC容器初始化过程中,首先准备BeanFactory
并执行BeanFactoryPostProsser
(BeanFactory
后置处理器),然后注册BeanPostProsser
(Bean
后置处理器),启动tomcat
,最后借助BeanFactory
完成Bean
的实例化。
java
public void refresh() throws BeansException, IllegalStateException {
synchronized(this.startupShutdownMonitor) {
StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
this.prepareRefresh();
// 准备beanFactory
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
this.prepareBeanFactory(beanFactory);
try {
this.postProcessBeanFactory(beanFactory);
StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
// 执行 BeanFactoryPostPresser
this.invokeBeanFactoryPostProcessors(beanFactory);
// 注册 BeanPostProsser
this.registerBeanPostProcessors(beanFactory);
beanPostProcess.end();
// 国际化相关
this.initMessageSource();
this.initApplicationEventMulticaster();
// 初始化特殊的Bean(启动tomcat)
this.onRefresh();
this.registerListeners();
// 实例化容器中非懒加载的单例Bean
this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();
} catch (BeansException var10) {
if (this.logger.isWarnEnabled()) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var10);
}
this.destroyBeans();
this.cancelRefresh(var10);
throw var10;
} finally {
// 收尾工作
this.resetCommonCaches();
contextRefresh.end();
}
}
}
最近更新:10/11/2024, 5:03:40 AM
上一篇:Centos7关闭邮件服务|下一篇:docker部署openvpn