简单清晰的SpringBoot启动流程
文章目录
- 前言
- 一、创建SpringApplication对象
- 二、执行 run() 方法
- 总结
前言
SpringBoot启动流程总体分为两步,第一步先SpringApplication对象,第二步为执行run()方法。我们只要抓住这个思路,在深入研究每一步背后做了什么,对SpringBoot的启动流程就能熟练掌握。
一、创建SpringApplication对象
1.首先进入run()方法,run方法中new创建了一个SpringApplication实例。
2.下面是创建SpringApplication实例所做的一系列操作。
总结:SpringApplication实例所做的一系列操作有以下几个关键步骤:
- SpringApplication对象在初始化时,从类路径中推断并设置应用类型。应用类型有三种:非web应用,基于servlet的web应用和基于REACTIVE的web应用。
- 从SpringFactories文件中找到配置的事件监听器,并保存起来
- 推断运行主类
二、执行 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;}
该方法中实现了如下几个关键步骤:
- 创建了应用的监听器SpringApplicationRunListeners并开始监听。
- 加载SpringBoot配置环境(ConfigurableEnvironment),如果是通过web容器发布,会加载StandardEnvironment,其最终也是继承了ConfigurableEnvironment。
- 创建run方法的返回对象:ConfigurableApplicationContext(应用配置上下文)。ConfigurableApplicationContext是ApplicationContext的子类,该接口的主要任务就是配置应用上下文功能。
- 回到run方法内,prepareContext方法将listeners、environment、applicationArguments、banner等重要组件与上下文对象关联。
- 接下来的refreshContext(context)方法是实现spring-boot-starter-*(mybatis、redis等)自动化配置的关键,包括spring.factories的加载,bean的实例化等核心工作。
- 启动监听器,通知程序运行。
总结:Springboot的启动,主要创建了配置环境(environment)、事件监听(listeners)、应用上下文(applicationContext),并基于以上条件,在容器中开始实例化我们需要的Bean。
总结
SpringApplication类为我们引导项目提供了一种便利的方式——通过main()方法直接启动。大多数情况下,我们可以把项目启动这个任务直接委托给SpringApplication.run方法。所以我们在学习SpringBoot启动流程时,抓住两点即可:1.创建并初始化SpringApplication ;2.执行run()方法。
简单清晰的SpringBoot启动流程相关推荐
- SpringBoot 启动流程(细节拉满)
SpringBoot 启动流程(细节拉满) 网上搜了一下,这方面网上的资料不少,有些从@SpringBootApplication来入手讲.个人不能苟同吧,讲一讲我的理解.还有一些讲的比较笼统,我来写 ...
- SpringBoot启动流程分析(四):IoC容器的初始化过程
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- Springboot启动流程分析(四):完成启动流程
目录 一 添加BeanPostProcessors到IOC容器 二 国际化支持 三 初始化监听器的多路播放器 四 刷新容器 五 注册监听器到IOC容器的多播器 六 完成bean的大规模实例化 6.1 ...
- SPRINGBOOT启动流程及其原理
Spring Boot.Spring MVC 和 Spring 有什么区别? 分别描述各自的特征: Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等:但他们的 ...
- SpringBoot入门到精通-SpringBoot启动流程(七)
定义自己的starter SpringBoot入门到精通-Spring的注解编程(一) SpringBoot入门到精通-SpringBoot入门(二) SpringBoot入门到精通-Spring的基 ...
- Java面试--SpringBoot启动流程
一.SpringBoot是什么 SpringBoot 是依赖于 Spring 的,比起 Spring,除了拥有 Spring 的全部功能以外,SpringBoot 无需繁琐的 Xml 配置,这取决于它 ...
- Java springboot启动流程
springboot启动流程 一.简述 二.注解 三.启动 1. 运行 SpringApplication.run() 方法 2. 确定应用程序启动类型 3. 加载所有的初始化器 4. 加载所有的监听 ...
- SPRING-BOOT启动流程--图解
Spring-Boot启动流程是一个初问较多的梗 故事开篇 内容提要 本次内容排布 第一部分:启动main到initialize 第二部分:stopWatch到context 功能快捷键 合理的创建标 ...
- SpringBoot启动流程解析
写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图ke ...
最新文章
- python函数返回元组平均数_关于python:使用函数中的单个项返回元组
- 图解自监督学习,人工智能蛋糕中最大的一块
- 关于c++类中的指针成员问题
- k8s pod MySQL环境变量,配置 – 在Docker中相当于env-file的Kubernetes
- 推荐系统笔记:基于非负矩阵分解的协同过滤
- 企业内网利用devpi搭建pypi私服
- linux mysql启动_MySQL 安装(二)
- 在Linux下编写C程序,怎么检查程序是否有内存泄漏?
- 【Linux】处理数据文件
- Java内存分配之堆、栈和常量池(转)
- 为何有 60% 的程序员拒绝公开讨论薪资?
- 利用nginx 反向代理解决跨域问题
- opencv 画出各种滤波器二维图像 证明拉普拉斯滤波器是一个高通滤波器
- hack (浏览器兼容css hack)
- D. Array Splitting
- 【优化求解】基于matlab粒子群与遗传算法混合算法求解切削参数优化问题(以成本和碳排放量为目标函数)【含Matlab源码 1619期】
- php共生模式,phpwamp单身狗模式的详解与分析,单身狗模式/即霸体模式的作用讲解。...
- 软考高级 真题 2009年下半年 信息系统项目管理师 论文
- POJ-1149网络流
- robocup学习篇(一)
热门文章
- Git config alias 设置命令别名
- 研究一下exp, ln, pow的数值计算
- 文末送书 | 当Python遇上高考,会发生什么?
- 一年考研经历的回顾和总结(2)——不一样的辞职考研
- iPhone秘籍-彩信,短信转发,软件推荐
- python使用入门知识
- Visual Studio 设置增量编译
- 网传字节实习生删库,有员工回应昨晚处理事故到三点;快手宣布7月将取消大小周;中科院发布国产开源RISC-V处理器“香山”...
- java 启动类_java程序启动,类的加载情况
- 分治算法中的数学——求解递归式(代入法)