Springboot启动源码流程
- 启动run方法,会构建SpringApplication对象,构造方法中执行
WebApplicationType#deduceFromClasspath
判断当前程序类型,用springboot的SPI技术加载了初始化器和监听器。加载META-INF/spring.factories
,存放到缓存中。 listeners.starting();
。监听器执行starting方法。SpringApplication#prepareEnvironment
。会创建env变量,会执行listeners.environmentPrepared(environment);
。主要是加载spring的配置信息到env中。SpringApplication#printBanner
。打印bannerSpringApplication#createApplicationContext
。根据当前程序类型创建spring容器,如果是SERVLET,会创建AnnotationConfigServletWebServerApplicationContext
。SpringApplication#prepareContext
。会挨个执行初始化器,执行listeners.contextPrepared(context);
,load方法和listeners.contextLoaded(context);
。load方法的作用主要是加载启动类 the context to load beans into 将启动类注入容器。SpringApplication#refreshContext
。会走到Spring的初始化流程,后面细说。SpringApplication#afterRefresh
,钩子函数。listeners.started(context);
。监听器执行started方法。- 执行spring容器中的
ApplicationRunner
和CommandLineRunner
。