spring boot 启动过程
在外面启动spring boot项目的时候,入口在如下方法中

那么它的启动过程是如何的,通过点击进去发现是如下方法;
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {return (new SpringApplication(primarySources)).run(args);}
在这个方法中,可以分为2个大步骤;
一:new SpringApplication(primarySources): 即将我们传进来的class进行创建为springApplication。
在这里面
1.记录传入的primarySources
2.推测当前应用的类型

3.从spring.factories中获取BootstrapRegistryInitializer
4.从spring.factories中获取ApplicationContextInitializer
5.并且也获取ApplicationListener
this.bootstrapRegistryInitializers = new ArrayList<>(getSpringFactoriesInstances(BootstrapRegistryInitializer.class));setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));this.mainApplicationClass = deduceMainApplicationClass();
6.推测当前main方法对应的启动类

二:调用run()方法
1.创建并初始化DefaultBootstrapContext
2.获取SpringApplicationRunListeners
SpringApplicationRunListeners listeners = getRunListeners(args);
3.调用SpringApplicationRunListeners 的starting(),发布ApplicationStartingEvent事件。
4.将启动参数artgs封装为ApplicationArguments对象
5.准备Environment
6.创建spring容器(ApplicationContext)
7.预处理spring容器
prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
8.刷新
refreshContext(context);
9.调用SpringApplicationRunListener的started()方法,发布ApplicationStartedEvent事件
listeners.started(context, timeTakenToStartup);
10.调用SpringApplicationRunListener的ready()方法,发布ApplicationReadyEvent事件
try {Duration timeTakenToReady = Duration.ofNanos(System.nanoTime() - startTime);listeners.ready(context, timeTakenToReady);}catch (Throwable ex) {handleRunFailure(context, ex, null);throw new IllegalStateException(ex);}
