文章目录

  • 前言
  • 一、创建SpringApplication对象
  • 二、执行 run() 方法
  • 总结

前言

SpringBoot启动流程总体分为两步,第一步先SpringApplication对象,第二步为执行run()方法。我们只要抓住这个思路,在深入研究每一步背后做了什么,对SpringBoot的启动流程就能熟练掌握。


一、创建SpringApplication对象

1.首先进入run()方法,run方法中new创建了一个SpringApplication实例。


2.下面是创建SpringApplication实例所做的一系列操作。

总结:SpringApplication实例所做的一系列操作有以下几个关键步骤:

  1. SpringApplication对象在初始化时,从类路径中推断并设置应用类型。应用类型有三种:非web应用,基于servlet的web应用和基于REACTIVE的web应用。
  2. 从SpringFactories文件中找到配置的事件监听器,并保存起来
  3. 推断运行主类

二、执行 run() 方法

创建完SpringApplication实例之后,继续执行run方法,run方法的源码如下。

 public ConfigurableApplicationContext run(String... args) {//1.开启程序启动计时器long startTime = System.nanoTime();DefaultBootstrapContext bootstrapContext = createBootstrapContext();ConfigurableApplicationContext context = null;//2.无输入不影响工作configureHeadlessProperty();//3.获取监听器SpringApplicationRunListeners listeners = getRunListeners(args);//4.启动监听器listeners.starting(bootstrapContext, this.mainApplicationClass);try {//5.设置程序启动参数ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);//6.配置环境ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);//7.跳过bean检索configureIgnoreBeanInfo(environment);//8.打印bannerBanner printedBanner = printBanner(environment);//9.创建应用程序上下文context = createApplicationContext();context.setApplicationStartup(this.applicationStartup);prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);//10.刷新上下文refreshContext(context);//11.上下文后置处理afterRefresh(context, applicationArguments);//12.结束计时器Duration timeTakenToStartup = Duration.ofNanos(System.nanoTime() - startTime);if (this.logStartupInfo) {new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), timeTakenToStartup);}//13.启动监听器listeners.started(context, timeTakenToStartup);//14.通知程序运行callRunners(context, applicationArguments);}catch (Throwable ex) {handleRunFailure(context, ex, listeners);throw new IllegalStateException(ex);}try {Duration timeTakenToReady = Duration.ofNanos(System.nanoTime() - startTime);listeners.ready(context, timeTakenToReady);}catch (Throwable ex) {handleRunFailure(context, ex, null);throw new IllegalStateException(ex);}return context;}

该方法中实现了如下几个关键步骤:

  1. 创建了应用的监听器SpringApplicationRunListeners并开始监听。
  2. 加载SpringBoot配置环境(ConfigurableEnvironment),如果是通过web容器发布,会加载StandardEnvironment,其最终也是继承了ConfigurableEnvironment。
  3. 创建run方法的返回对象:ConfigurableApplicationContext(应用配置上下文)。ConfigurableApplicationContext是ApplicationContext的子类,该接口的主要任务就是配置应用上下文功能。
  4. 回到run方法内,prepareContext方法将listeners、environment、applicationArguments、banner等重要组件与上下文对象关联。
  5. 接下来的refreshContext(context)方法是实现spring-boot-starter-*(mybatis、redis等)自动化配置的关键,包括spring.factories的加载,bean的实例化等核心工作。
  6. 启动监听器,通知程序运行

总结:Springboot的启动,主要创建了配置环境(environment)、事件监听(listeners)、应用上下文(applicationContext),并基于以上条件,在容器中开始实例化我们需要的Bean。


总结

SpringApplication类为我们引导项目提供了一种便利的方式——通过main()方法直接启动。大多数情况下,我们可以把项目启动这个任务直接委托给SpringApplication.run方法。所以我们在学习SpringBoot启动流程时,抓住两点即可:1.创建并初始化SpringApplication ;2.执行run()方法。


简单清晰的SpringBoot启动流程相关推荐

  1. SpringBoot 启动流程(细节拉满)

    SpringBoot 启动流程(细节拉满) 网上搜了一下,这方面网上的资料不少,有些从@SpringBootApplication来入手讲.个人不能苟同吧,讲一讲我的理解.还有一些讲的比较笼统,我来写 ...

  2. SpringBoot启动流程分析(四):IoC容器的初始化过程

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  3. Springboot启动流程分析(四):完成启动流程

    目录 一 添加BeanPostProcessors到IOC容器 二 国际化支持 三 初始化监听器的多路播放器 四 刷新容器 五 注册监听器到IOC容器的多播器 六 完成bean的大规模实例化 6.1 ...

  4. SPRINGBOOT启动流程及其原理

    Spring Boot.Spring MVC 和 Spring 有什么区别? 分别描述各自的特征: Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等:但他们的 ...

  5. SpringBoot入门到精通-SpringBoot启动流程(七)

    定义自己的starter SpringBoot入门到精通-Spring的注解编程(一) SpringBoot入门到精通-SpringBoot入门(二) SpringBoot入门到精通-Spring的基 ...

  6. Java面试--SpringBoot启动流程

    一.SpringBoot是什么 SpringBoot 是依赖于 Spring 的,比起 Spring,除了拥有 Spring 的全部功能以外,SpringBoot 无需繁琐的 Xml 配置,这取决于它 ...

  7. Java springboot启动流程

    springboot启动流程 一.简述 二.注解 三.启动 1. 运行 SpringApplication.run() 方法 2. 确定应用程序启动类型 3. 加载所有的初始化器 4. 加载所有的监听 ...

  8. SPRING-BOOT启动流程--图解

    Spring-Boot启动流程是一个初问较多的梗 故事开篇 内容提要 本次内容排布 第一部分:启动main到initialize 第二部分:stopWatch到context 功能快捷键 合理的创建标 ...

  9. SpringBoot启动流程解析

    写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图ke ...

最新文章

  1. tensorflow随笔 -QueueRunner
  2. boost::hana::is_embedded用法的测试程序
  3. YbtOJ#652-集合比较【Treap】
  4. js模版引擎handlebars.js实用教程——结束语
  5. 浅谈面向对象的javascript几个特性
  6. 基础向:关于异常(Exception)面试常会问到的问题
  7. 程序清单4.1_talkback.c程序_《C Primer Plus》P60
  8. 非正常关机导致无法启动MYSQL提示丢失mysql.sock的解决办法
  9. 计算机二级C语言题库(60套真题+刷题软件)2022年9月份新题第二套
  10. 空间计量经济学(2)---广义空间自回归与空间误差模型
  11. dxdiag使用小结
  12. React Native组件之Switch和Picker和Slide
  13. 带劲!厂内全流程智能仓储物流系统
  14. 交互设计:依据用户体验要素知识点,进行APP的分析和改良设计。
  15. linux归档和压缩的区别,文件的归档和压缩
  16. moment.js获取当天,本周,当月,当季,近n天开始结束时间
  17. 计算机函数sumif求平均值,『如何用sumif求平均年龄』excel表中如何算平均数及标准差...
  18. java高并发synchronized学习
  19. Spring+Hibernate 实现不同域名访问同一项目,自定义Filter根据域名选择对应的数据源...
  20. python open函数创建文件_python中怎样使用open创建文件?

热门文章

  1. linux平台xpt2046驱动,stm32 触摸屏 XPT2046
  2. 百度文库实现方案 openoffice.org 3 + swftools+flexpaper+java
  3. Ubuntu 20.04 安装运行 uuv_simulator
  4. Arbitrum奥德赛第一周跨链桥任务教程
  5. 移动端开发必备:安卓Android/苹果iphone主流机型尺寸
  6. 区块链产品溯源,一物一码全程可追溯
  7. 淘宝店铺关联销售方法讲解
  8. 网络编程:HTTP协议超级详解
  9. 用R语言,生成微信聊天记录词云。
  10. html5 输入框关键字搜索,vue input输入框关键字筛选检索列表数据展示