springboot启动源码分析

107 阅读1分钟

Springboot启动过程原理分析

一、new SpringApplication()实例

  • [ 静态助手,可用于使用默认设置和用户提供的参数从指定的源运行 {@link SpringApplication}。] image.png
  • [new SpringApplication()实例: 创建一个新的 {@link SpringApplication} 实例。应用程序上下文将从指定的主要来源加载 bean(有关详细信息,请参阅 {@link SpringApplication class-level}文档。可以在调用之前自定义实例]

image.png

1.将启动类加载到primarySources集合中

this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));

2.获取web容器默认servlet web server

this.webApplicationType = WebApplicationType.deduceFromClasspath();

3.设置spring初始化List

image.png

4.将ApplicationListener设置到ApplicationContext上下文

5.通过反射拿到启动类并设置到SpringApplication.mainApplicationClass属性

二、new SpringApplication().run()启动

  • [运行 Spring 应用程序,创建并刷新一个新的]

1.获取SpringApplicationRunListeners并staring启动监听(SimpleApplicationEventMulticaster.multicastEvent(new ApplicationStartingEvent(this.application, this.args))事件);

2.加载环境参数,忽略加载的bean增加到System.Properties对象属性中 image.png 3.打印banner;

4.根据web容器类型(servlet web server)创建配置上下文ConfigurableApplicationContext

5.初始化上下文, 包含环境、配置上下文和监听, 刷新上下文;

6.启动监听(listeners.started(context)[ConfigurableApplicationContext.publishEvent(new ApplicationStartedEvent(this.application, this.args, context)),ApplicationStartedEvent事件类],启动run()(ApplicationRunner或CommandLineRunner)

7.最后listeners.running(context)[ConfigurableApplicationContext.publishEvent(new ApplicationReadyEvent(this.application, this.args, context)),ApplicationReadyEvent事件类];

image.png