文章目录

  • 前言
  • 一、创建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. python函数返回元组平均数_关于python:使用函数中的单个项返回元组
  2. 图解自监督学习,人工智能蛋糕中最大的一块
  3. 关于c++类中的指针成员问题
  4. k8s pod MySQL环境变量,配置 – 在Docker中相当于env-file的Kubernetes
  5. 推荐系统笔记:基于非负矩阵分解的协同过滤
  6. 企业内网利用devpi搭建pypi私服
  7. linux mysql启动_MySQL 安装(二)
  8. 在Linux下编写C程序,怎么检查程序是否有内存泄漏?
  9. 【Linux】处理数据文件
  10. Java内存分配之堆、栈和常量池(转)
  11. 为何有 60% 的程序员拒绝公开讨论薪资?
  12. 利用nginx 反向代理解决跨域问题
  13. opencv 画出各种滤波器二维图像 证明拉普拉斯滤波器是一个高通滤波器
  14. hack (浏览器兼容css hack)
  15. D. Array Splitting
  16. 【优化求解】基于matlab粒子群与遗传算法混合算法求解切削参数优化问题(以成本和碳排放量为目标函数)【含Matlab源码 1619期】
  17. php共生模式,phpwamp单身狗模式的详解与分析,单身狗模式/即霸体模式的作用讲解。...
  18. 软考高级 真题 2009年下半年 信息系统项目管理师 论文
  19. POJ-1149网络流
  20. robocup学习篇(一)

热门文章

  1. Git config alias 设置命令别名
  2. 研究一下exp, ln, pow的数值计算
  3. 文末送书 | 当Python遇上高考,会发生什么?
  4. 一年考研经历的回顾和总结(2)——不一样的辞职考研
  5. iPhone秘籍-彩信,短信转发,软件推荐
  6. python使用入门知识
  7. Visual Studio 设置增量编译
  8. 网传字节实习生删库,有员工回应昨晚处理事故到三点;快手宣布7月将取消大小周;中科院发布国产开源RISC-V处理器“香山”...
  9. java 启动类_java程序启动,类的加载情况
  10. 分治算法中的数学——求解递归式(代入法)