当前位置:   article > 正文

SpringBoot学习-第四节-Spring启动原理_org.springframework.cloud.bootstrap.refreshbootstr

org.springframework.cloud.bootstrap.refreshbootstrapregistryinitializer

一、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方法

(14)上述所有操作出现异常时:调用listener的fail方法

(15)调用litener的running方法,通知应用正在运行

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/479512
推荐阅读
相关标签
  

闽ICP备14008679号