Springboot启动过程原理分析
一、new SpringApplication()实例
- [ 静态助手,可用于使用默认设置和用户提供的参数从指定的源运行 {@link SpringApplication}。]
- [new SpringApplication()实例: 创建一个新的 {@link SpringApplication} 实例。应用程序上下文将从指定的主要来源加载 bean(有关详细信息,请参阅 {@link SpringApplication class-level}文档。可以在调用之前自定义实例]
1.将启动类加载到primarySources集合中
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
2.获取web容器默认servlet web server
this.webApplicationType = WebApplicationType.deduceFromClasspath();
3.设置spring初始化List
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对象属性中
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事件类];