一、SpringBoot启动过程
1.第一步:创建SpringAppication应用
(1)加载资源:
- 资源加载器:resourceLoader
- 主配置类:primarySources
- 应用类型:webApplicationType
- 初始引导启动器:bootstrapRegistryInitializers, ○ 去spring.factories文件中找 org.springframework.boot.Bootstrapper
- 初始化器:ApplicationContextInitializer, ○ 去spring.factories文件中找 ApplicationContextInitializer
- 应用监听器:ApplicationListener, ○ 去spring.factories文件中找 ApplicationListener
2.第二步:运行SpringAppication应用
(1)创建StopWatch,记录应用启动时间
(2)创建引导上下文:createBootstrapContext()
遍历之前加载的引导启动器bootstrapRegistryInitializers执行initialize方法,完成引导启动器的上下文环境设置
(3)让当前应用进入headless模式:configureHeadlessProperty();
(4)获取所有运行监听器:getRunListeners();
去spring.factories找 SpringApplicationRunListener.
(5)遍历所有的运行监听器,调用starting方法,通知所有监听器,项目正在启动
(6)保存命令行参数:ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
(7)准备环境:ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
- 返回或创建基础环境信息对象:ConfigurableEnvironment environment = getOrCreateEnvironment();
- 配置基础环境信息:configureEnvironment(environment, applicationArguments.getSourceArgs());
- 绑定环境信息:ConfigurationPropertySources.attach(environment);
- 监听器通知环境准备完成:listeners.environmentPrepared(bootstrapContext, environment);
(8)创建IOC容器:context = createApplicationContext();
根据当前应用类型创建
(9)准备IOC容器信息:prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
- 保存环境信息:context.setEnvironment(environment);
- IOC容器后置处理流程:postProcessApplicationContext(context);
- 应用初始化器:applyInitializers(context);遍历之前加载的ApplicationContextInitializer执行initialize方法,来对IOC容器初始化
- 遍历所有的listeners执行listeners.contextPrepared(context);通知所有监听器IOC上下文信息初始化完成
- 遍历所有的listeners执行listeners.contextLoaded(context);通知所有监听器IOC容器已经加载完成
(10)刷新IOC容器:refreshContext(context);创建IOC容器的所有组件
(11)执行IOC容器刷新完成后的操作:afterRefresh(context, applicationArguments);
(12)所有监听器执行started方法:通知所有监听器项目已经启动
(13)调用所有的runners:
- 获取容器中的ApplicationRunner和CommandLineRunner
- 合并所有runner并按照@Order进行排序
- 遍历runners调用run方法