大家好,我是富贵,今天继续为大家带来SpringBoot启动流程源码级详解。
那么书接上回,在上一篇文章中我们已经说明了SpringBoot中的run()方法执行的主要流程就是创建SpringApplication并运行SpringApplication,并且在上篇文章中我们也已经分析了SpringApplication的创建流程,那么下面就让我们来看看SpringApplication是怎么运行的吧!
运行SpringApplication
创建引导上下文(Context环境)createBootstrapContext()获取所有的运行监听器保存命令行参数准备环境prepareEnvironment(listeners, applicationArguments);private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,
ApplicationArguments applicationArguments)
{
// 创建或获取环境
ConfigurableEnvironment environment = getOrCreateEnvironment();
/**配置环境
1.先配置addConversionService(类型转换器),用来转换配置文件中的配置
2.configurePropertySources()加载外部的配置源,读取所有配置源的配置属性值
3.configureProfiles(environment,args);将读取额外环境配置文件中的配置,添加并激活到环境中
**/
configureEnvironment(environment, applicationArguments.getSourceArgs());
//将环境绑定
ConfigurationPropertySources.attach(environment);
//监听器调用environmentPrepared();通知所有监听器:当前环境准备完成
listeners.environmentPrepared(environment);
//绑定
bindToSpringApplication(environment);
if (!this.isCustomEnvironment) {
environment=new EnvironmentConverter(getClassLoader()).convertEnvironmentIfNecessary(environment,
deduceEnvironmentClass());
}
ConfigurationPropertySources.attach(environment);
return environment;
}
创建IOC容器 createApplicationContext() –>这是整个过程中最重要的一步,就是根据项目类型(Servlet)创建对应的容器,并保存准备IOC容器信息 prepareContext() private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment,SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments, Banner printedBanner) {
//IOC容器保存环境信息
context.setEnvironment(environment);
//IOC容器的后置处理流程:包括注册单例实例,添加资源加载器XxxLoader,添加类型转换器aConversionService
postProcessApplicationContext(context);
//应用初始化器:获取创建SpringApplication时从spring.factories文件中加载的ApplicationContextInitializer
//初始化器,并调用他们的initialize()方法,对IOC容器进行初始化扩展功能
applyInitializers(context);
//所有的监听器调用contextPrepared(),通知所有的监听器容器准备完成
listeners.contextPrepared(context);
if (this.logStartupInfo) {
logStartupInfo(context.getParent() == null);
logStartupProfileInfo(context);
}
// Add boot specific singleton beans
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
//将命令行指令集作为一个bean组件添加
beanFactory.registerSingleton(“springApplicationArguments”, applicationArguments);
//注册banner组件,加载banner图形
if (printedBanner != null) {
beanFactory.registerSingleton(“springBootBanner”, printedBanner);
}
if (beanFactory instanceof DefaultListableBeanFactory) {
((DefaultListableBeanFactory) beanFactory)
.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
}
if (this.lazyInitialization) {
context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor());
}
// Load the sources
Set<Object> sources = getAllSources();
Assert.notEmpty(sources, “Sources must not be empty”);
load(context, sources.toArray(new Object[0]));
//所有监听器调用contextLoaded(),通知所有的监听器IOC容器加载完成
listeners.contextLoaded(context);
}
刷新IOC容器 : refreshContext()调用所有监听器的running()方法,通知所有监听器,IOC容器running若有异常,调用 : listeners.failed(context, exception);通知监听器failed好啦,以上就是SpringApplication运行的全过程啦,希望对各位小伙伴能够起到些许帮助。
双击不迷路,您的鼓励就是我们不断前进的动力!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END