-
SpringApplication.run()
-
new SpringApplication()
-
配置resourceloader
-
this.webApplicationType = WebApplicationType.deduceFromClasspath();
判断当前应用程序的类型(serlvet,reactive,none)
-
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
获取初始化器对象7个 -
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
获取监听器的实例对象11个
-
this.mainApplicationClass = deduceMainApplicationClass();
找到当前应用程序的主类,开始执行
-
-
run启动
-
stopWatch.start();
开启计时器 -
定义异常报告器
-
configureHeadlessProperty();
配置java.awt.headless系统参数为true -
SpringApplicationRunListeners listeners = getRunListeners(args); listeners.starting();
注册listeners
创建监听器对象SpringApplicationRunListener,从配置文件中读取到EventPublishingRunListener创建eventpublicingrunlistener对象,并且创建出SimpleApplicationEventMulticaster,将application的11个监听器给到了当前对象,此时才能方便我们从中获取出符合监听事件的几个监听器
-
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
加载命令行的参数值,解析在命令中通过–key=value输入的属性值,封装到ApplicationArguments对象中 -
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
准备应用程序的运行环境ConfigurableEnvironment environment = getOrCreateEnvironment();
获取或者创建一个环境,根据当前应用程序的类型做判断configureEnvironment(environment, applicationArguments.getSourceArgs());
对当前环境进行配置ConfigurationPropertySources.attach(environment);
配置propertySource对它自己的递归依赖,添加一个属性listeners.environmentPrepared(environment);
传播ApplicationEnvironmentPreparedEvent事件,向环境中添加两个属性bindToSpringApplication(environment)
方法名称是将环境绑定给当前应用程序- 对当前的环境类型做判断,如果不一致进行转换
ConfigurationPropertySources.attach(environment);
-
configureIgnoreBeanInfo(environment);
设置spring.beaninfo.ignore的值为true,保证某些bean不会添加到准备环境中 -
Banner printedBanner = printBanner(environment);
根据配置输出banner -
context = createApplicationContext();
根据应用程序类型创建上下文对象,在父子类关系中完成了很多操作在创建的过程中,还创建了reader对象、scanner对象和新的environment对象,将新的环境对象赋值给上下文对象和其内部的scanner和reader,还配置了条件判断器对象(conditionEvaluator)
-
exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[] { ConfigurableApplicationContext.class }, context);
设置异常报告器对象 -
prepareContext(context, environment, listeners, applicationArguments, printedBanner);
上下文的准备工作context.setEnvironment(environment);
重新配置上下文的环境对象postProcessApplicationContext(context);
为上下文对象的beanFactory注入了三个postprocessor对象applyInitializers(context);
根据初始化器循环初始化上下文listeners.contextPrepared(context);
传播上下文准备事件beanFactory.registerSingleton("springApplicationArguments", applicationArguments);
向beanFactory注册命令行参数((DefaultListableBeanFactory) beanFactory).setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
设置allowBeanDefinitionOverriding为falseload(context, sources.toArray(new Object[0]));
加载很多资源配置文件,加载上下文listeners.contextLoaded(context);
传播上下文加载事件
-
refreshContext(context);
刷新应用上下文 -
afterRefresh(context, applicationArguments);
应用上下文刷新的后置处理,做一些扩展功能 -
_stopWatch.stop();
计时结束 -
if (this.logStartupInfo) { new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch); }
输出日志记录,执行类主名、时间信息
-
listeners.started(context);
发布上下文启动事件 -
listeners.running(context);
发布应用上下文就绪事件 -
return context;
返回应用上下文
-
2.3.4 SpringBoot启动主流程
最新推荐文章于 2023-07-30 01:22:22 发布