简单清晰的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 ...
最新文章
- tensorflow随笔 -QueueRunner
- boost::hana::is_embedded用法的测试程序
- YbtOJ#652-集合比较【Treap】
- js模版引擎handlebars.js实用教程——结束语
- 浅谈面向对象的javascript几个特性
- 基础向:关于异常(Exception)面试常会问到的问题
- 程序清单4.1_talkback.c程序_《C Primer Plus》P60
- 非正常关机导致无法启动MYSQL提示丢失mysql.sock的解决办法
- 计算机二级C语言题库(60套真题+刷题软件)2022年9月份新题第二套
- 空间计量经济学(2)---广义空间自回归与空间误差模型
- dxdiag使用小结
- React Native组件之Switch和Picker和Slide
- 带劲!厂内全流程智能仓储物流系统
- 交互设计:依据用户体验要素知识点,进行APP的分析和改良设计。
- linux归档和压缩的区别,文件的归档和压缩
- moment.js获取当天,本周,当月,当季,近n天开始结束时间
- 计算机函数sumif求平均值,『如何用sumif求平均年龄』excel表中如何算平均数及标准差...
- java高并发synchronized学习
- Spring+Hibernate 实现不同域名访问同一项目,自定义Filter根据域名选择对应的数据源...
- python open函数创建文件_python中怎样使用open创建文件?
热门文章
- linux平台xpt2046驱动,stm32 触摸屏 XPT2046
- 百度文库实现方案 openoffice.org 3 + swftools+flexpaper+java
- Ubuntu 20.04 安装运行 uuv_simulator
- Arbitrum奥德赛第一周跨链桥任务教程
- 移动端开发必备:安卓Android/苹果iphone主流机型尺寸
- 区块链产品溯源,一物一码全程可追溯
- 淘宝店铺关联销售方法讲解
- 网络编程:HTTP协议超级详解
- 用R语言,生成微信聊天记录词云。
- html5 输入框关键字搜索,vue input输入框关键字筛选检索列表数据展示