SpringBoot学习-第四节-Spring启动原理

一、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方法,通知应用正在运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值