当前位置: 首页 > news >正文

SpringBoot源码启动流程(待完善)

SpringBoot源码启动流程

1. 构造SpringApplication对象

1.1 推测web应用类型

判断关键类是否存在来区分类型

  • REACTIVE
  • NONE
  • SERVLET
	static WebApplicationType deduceFromClasspath() {if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null) && !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null)&& !ClassUtils.isPresent(JERSEY_INDICATOR_CLASS, null)) {return WebApplicationType.REACTIVE;}for (String className : SERVLET_INDICATOR_CLASSES) {if (!ClassUtils.isPresent(className, null)) {return WebApplicationType.NONE;}}return WebApplicationType.SERVLET;}

2. 设置Initializers和Listeners扩展点

3. 推测Main方法所在类

	public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {this.resourceLoader = resourceLoader;Assert.notNull(primarySources, "PrimarySources must not be null");this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));// 推测web应用this.webApplicationType = WebApplicationType.deduceFromClasspath();// 设置Initializer和Listener扩展点setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));// 推测main方法所在类this.mainApplicationClass = deduceMainApplicationClass();}

2. run(String... args)方法

SpringApplicationRunListener.starting

SpringBoot提供了一个EventPublishingRunListener,它实现了SpringApplicationRunListener接口,默认情况下会利用EventPublishingRunListener发布一个ApplicationContextInitializedEvent事件,程序员可通过定义ApplicationListener来消费这个事件

		SpringApplicationRunListeners listeners = getRunListeners(args);listeners.starting();

创建Environment

解析配置文件, 环境变量, 启动命令参数

 

SpringApplicationRunListeners.environmentPrepared

用EventPublishingRunListener发布一个ApplicationEnvironmentPreparedEvent事件,默认情况会有一个EnvironmentPostProcessorApplicationListener来消费这个事件,而这个ApplicationListener接收到这个事件之后,就会解析application.properties、application.yml文件,并添加到Environment对象中去。

打印Banner

创建Spring容器

	protected ConfigurableApplicationContext createApplicationContext() {Class<?> contextClass = this.applicationContextClass;if (contextClass == null) {try {switch (this.webApplicationType) {case SERVLET:contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS);break;case REACTIVE:contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);break;default:contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);}}catch (ClassNotFoundException ex) {throw new IllegalStateException("Unable create a default ApplicationContext, " + "please specify an ApplicationContextClass",ex);}}return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);}

配置解析流程

SpringBoot配置优先级

官网描述:Core Features

 

  1. Default properties (specified by setting SpringApplication.setDefaultProperties).

  2. @PropertySource annotations on your @Configuration classes. Please note that such property sources are not added to the Environment until the application context is being refreshed. This is too late to configure certain properties such as logging.* and spring.main.* which are read before refresh begins.

  3. Config data (such as application.properties files).

  4. RandomValuePropertySource that has properties only in random.*.

  5. OS environment variables.

  6. Java System properties (System.getProperties()).

  7. JNDI attributes from java:comp/env.

  8. ServletContext init parameters.

  9. ServletConfig init parameters.

  10. Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system property).

  11. Command line arguments.

  12. properties attribute on your tests. Available on @SpringBootTest and the test annotations for testing a particular slice of your application.

  13. @DynamicPropertySource annotations in your tests.

  14. @TestPropertySource annotations on your tests.

  15. Devtools global settings properties in the $HOME/.config/spring-boot directory when devtools is active.

Config data files are considered in the following order:

  1. Application properties packaged inside your jar (application.properties and YAML variants).

  2. Profile-specific application properties packaged inside your jar (application-{profile}.properties and YAML variants).

  3. Application properties outside of your packaged jar (application.properties and YAML variants).

  4. Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML variants).

相关文章:

SpringBoot源码启动流程(待完善)

SpringBoot源码启动流程 1. 构造SpringApplication对象 1.1 推测web应用类型 判断关键类是否存在来区分类型 REACTIVENONESERVLET static WebApplicationType deduceFromClasspath() {if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null) && !ClassUtils.isP…...

存内计算技术打破常规算力局限性

目录 前言 关于存内计算 1、常规算力局限性 2、存内计算诞生记 3、存内计算核心 存内计算芯片研发历程及商业化 1、存内计算芯片研发历程 2、存内计算先驱出道 3、存内计算商业化落地 基于知存科技存内计算开发板ZT1的降噪验证 &#xff08;一&#xff09;任务目标以…...

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票帖子明细实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...

RabbitMQ入门到实战——高级篇

消息的可靠性 生产者的可靠性&#xff08;确保消息一定到达MQ&#xff09; 生产者重连 这⾥除了enabled是false外&#xff0c;其他 initial-interval 等默认都是⼀样的值。 生产者确认 生产者确认代码实现 application中增加配置&#xff1a;&#xff08;publisher-returns…...

05.阿里Java开发手册——前后端规约

【强制】前后端交互的 API&#xff0c;需要明确协议、域名、路径、请求方法、请求内容、状态码、响 应体。 说明&#xff1a; 协议&#xff1a;生产环境必须使用 HTTPS。路径&#xff1a;每一个 API 需对应一个路径&#xff0c;表示 API 具体的请求地址&#xff1a; a&#xff…...

Linux网络服务部署yum仓库

目录 一、网络文件 1.1.存储类型 1.2.FTP 文件传输协议 1.3.传输模式 二、内网搭建yum仓库 一、网络文件 1.1.存储类型 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff0…...

智慧工地AI识别安全预警解决方案---豌豆云

实现在工地内所有视频覆盖区域对工人未穿工作服的24小时AI识别监测&#xff0c;发现人员未穿工作服及时报警至平台; 实现在工地内重点关注区域的AI人员统计; 实现在工地内监控覆盖区域的烟雾、火源24小时AI识别检测,发现烟雾、火源时及时报警&#xff0c;并通知相关负责人采取…...

红队打靶练习:TOMMY BOY: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb WEB robots.txt get flag1 get flag2 FTP登录 文件下载 更改代理 ffuf爆破 get flag3 crunch密码生成 wpscan 1、密码爆破 2、登录wordpress ssh登录 get flag4 信息收集 get flag5 信息收集 1、arp …...

Springboot中的@DependsOn注解

在我的最近的Spring Boot项目中&#xff0c;我遇到了涉及两个Bean的情况&#xff0c;Bean1和Bean2。在初始化过程中&#xff0c;我需要Bean2依赖于Bean1。 其中Spring中的 DependsOn 注解&#xff0c;允许我指定在创建Bean2之前&#xff0c;Spring应确保Bean1已初始化。 Depen…...

Django教程第5章 | Web开发实战-数据统计图表(echarts、highchart)

专栏系列&#xff1a;Django学习教程 前言 highchart&#xff0c;国外。 echarts&#xff0c;国内。 本项目集成 hightchart和echarts图表库实现数据统计功能。 包括&#xff1a;折线图&#xff0c;柱状图&#xff0c;饼图和数据集图。 效果图 echats Highcharts 源代码…...

【机器学习 西瓜书】期末复习笔记整理

一些杂点&#xff1a; 测试集如何归一化&#xff1f; —— 不是用测试集的均值和标准差&#xff0c;而是用训练集的&#xff01; 机器学习&#xff1a; 对计算机一部分数据进行学习&#xff0c;然后对另外一些数据进行预测与判断。 参考计算例题&#xff1a; 机器学习【期末复习…...

回归预测 | Matlab基于SO-GRU蛇群算法优化门控循环单元的数据多输入单输出回归预测

回归预测 | Matlab基于SO-GRU蛇群算法优化门控循环单元的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SO-GRU蛇群算法优化门控循环单元的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SO-GRU蛇群算法优化门控循环单元的数…...

自然语言处理实战项目25-T5模型和BERT模型的应用场景以及对比研究、问题解答

大家好,我是微学AI,今天给大家介绍一下自然语言处理实战项目25-T5模型和BERT模型的应用场景以及对比研究、问题解答。T5模型和BERT模型是两种常用的自然语言处理模型。T5是一种序列到序列模型,可以处理各种NLP任务,而BERT主要用于预训练语言表示。T5使用了类似于BERT的预训…...

分布式搜索——Elasticsearch

Elasticsearch 文章目录 Elasticsearch简介ELK技术栈Elasticsearch和Lucene 倒排索引正向索引倒排索引正向和倒排 ES概念文档和字段索引和映射Mysql与Elasticsearch 安装ES、Kibana安装单点ES创建网络拉取镜像运行 部署kibana拉取镜像部署 安装Ik插件扩展词词典停用词词典 索引…...

用python实现调用nosql

要使用Python调用NoSQL数据库&#xff0c;您需要使用适当的Python库。以下是使用Python调用MongoDB和Redis两个流行的NoSQL数据库的示例&#xff1a; 调用MongoDB 要使用Python调用MongoDB&#xff0c;您需要安装pymongo库。您可以使用以下命令在终端或命令提示符中安装它&…...

setTimeout和setInterval定时器的返回值

nodejs中定时器返回Timer对象,window中定时器返回number,所以可以使用ReturnType预定义类型推断—或者使用window.setInterval代替setInterval https://mybj123.com/13153.html...

C/C++指针

指针&#xff08;pointer&#xff09;是C/C语言中的一种数据类型。指针与int、char等数据类型相似&#xff0c;都是在内存中开辟相应类型的数据区域使用&#xff0c;不同的是int存储的是整数值&#xff0c;而指针存储的是内存地址。指针是在内存中开辟指针类型的区域存储内存地…...

2024 基于 Rust 的 linter 工具速度很快

2024 年 Web 工具的一大趋势是使用 Rust 重写现有工具。Rust 是一种出色的编程语言&#xff0c;能生成运行速度惊人的二进制文件&#xff0c;且与其它 Web 工具的互操作性极佳&#xff0c;这得益于 WebAssembly 的帮助。swc 和 Turbopack 等工具的速度提升为快速开发体验带来了…...

JWT相关问题及答案(2024)

1、什么是 JWT&#xff0c;它通常用于什么目的&#xff1f; JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在不同实体之间安全地传输信息。它由三个部分组成&#xff1a;头部&#xff08;Header&#xff09;、载…...

Linux例行性工作 at和crontab命令

1&#xff0c;例行性工作 例行性工作 —— 在某一时刻&#xff0c;必须要做的事情 —— 定时任务 &#xff08;比如&#xff1a;闹钟&#xff09; 例行性工作分为两种&#xff1a;“单一的例行性工作 at”和“循环的例行性工作 crontab” 2&#xff0c;单一执行的例行性工作 …...

多重插补与MICE:量化ESG评分不确定性的工程实践

1. 项目概述&#xff1a;当ESG评分遇上数据“黑洞”&#xff0c;我们如何量化不确定性&#xff1f;在金融和可持续投资领域&#xff0c;ESG评分正成为评估公司长期价值与风险的关键标尺。然而&#xff0c;从业者们都心知肚明一个公开的秘密&#xff1a;支撑这些评分的底层数据&…...

3个关键步骤:彻底掌握Synology NAS的USB网卡驱动配置

3个关键步骤&#xff1a;彻底掌握Synology NAS的USB网卡驱动配置 【免费下载链接】r8152 Synology DSM driver for Realtek RTL8152/RTL8153/RTL8156 based adapters 项目地址: https://gitcode.com/gh_mirrors/r8/r8152 为你的Synology NAS扩展网络能力从未如此简单。R…...

AI写教材新选择,低查重工具为教材编写提供强大支持!

教材编写难题与AI工具解决方案 整理教材知识点真的是一项“精细活”&#xff0c;主要难点在于如何平衡和衔接各知识点&#xff01;我们常常要担心是不是漏掉了重要的核心知识&#xff0c;或者把握不好知识的难易程度——小学的教材往往写得过于晦涩&#xff0c;学生理解有困难…...

终极指南:如何使用Universal x86 Tuning Utility释放你的硬件潜能

终极指南&#xff1a;如何使用Universal x86 Tuning Utility释放你的硬件潜能 【免费下载链接】Universal-x86-Tuning-Utility Unlock the full potential of your Intel/AMD based device. 项目地址: https://gitcode.com/gh_mirrors/un/Universal-x86-Tuning-Utility …...

暗黑破坏神2现代适配指南:如何使用d2dx解锁宽屏视野、提升帧率与画质

暗黑破坏神2现代适配指南&#xff1a;如何使用d2dx解锁宽屏视野、提升帧率与画质 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx …...

Struts2 S2-061漏洞深度解析:OGNL沙箱绕过与零代码应急加固

1. 这个漏洞不是“又一个Struts2漏洞”&#xff0c;而是权限失控的临界点S2-061&#xff08;CVE-2020-17530&#xff09;在2020年12月被Apache官方披露&#xff0c;但直到2022年中后期&#xff0c;我在三家不同行业的客户现场做渗透复测时&#xff0c;仍发现超过40%的存量Strut…...

VMware装Linux避坑大全:从CentOS 7网络连接到Ubuntu 22.04 VMware Tools安装一条龙

VMware虚拟机Linux系统实战避坑指南&#xff1a;网络配置与工具安装全解析刚装好Linux虚拟机的兴奋感&#xff0c;往往会被"ping不通百度"或"无法拖拽文件"的现实浇灭。这不是你的问题——超过60%的VMware新手都会在网络连接和工具安装环节卡壳。本文将用工…...

MAA明日方舟助手:一键解放双手的智能游戏伴侣终极指南

MAA明日方舟助手&#xff1a;一键解放双手的智能游戏伴侣终极指南 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://git…...

深入Linux内核:PTP硬件时间戳(HW Timestamping)是如何炼成的?

深入Linux内核&#xff1a;PTP硬件时间戳&#xff08;HW Timestamping&#xff09;的实现机制与技术解析 1. 高精度时间同步的技术演进与PTP核心价值 在现代分布式系统中&#xff0c;时间同步精度已经从毫秒级演进到纳秒级需求。金融交易系统要求时间偏差小于100纳秒&#xff…...

[智能体-27]:Ollama 通过命令行与模型交互的几种方式

Ollama 命令行交互四种常用方式1. 交互式对话&#xff08;最常用&#xff09;直接进入会话&#xff0c;持续聊天bash运行ollama run qwen2:7b输入问答&#xff0c;/bye 退出&#xff0c;/clear 清屏2. 单次命令提问&#xff08;一行执行&#xff09;无需进入会话&#xff0c;直…...