SpringBoot配置加载顺序

news2024/11/16 1:47:35

目录

    • 前言
    • 一、Spring Boot 配置优先级
    • 二、命令行参数
    • 三、示例分析

前言

Spring Boot 不仅可以通过配置文件进行配置,还可以通过环境变量、命令行参数等多种形式进行配置。这些配置都可以让开发人员在不修改任何代码的前提下,直接将一套 Spring Boot 应用程序在不同的环境中运行。

一、Spring Boot 配置优先级

以下是常用的 Spring Boot 配置形式及其加载顺序(优先级由高到低):

  1. 命令行参数
  2. 来自 java:comp/env 的 JNDI 属性
  3. Java 系统属性(System.getProperties())
  4. 操作系统环境变量
  5. RandomValuePropertySource 配置的 random.* 属性值
  6. 配置文件(YAML文件、Properties 文件)
  7. @Configuration 注解类上的 @PropertySource 指定的配置文件
  8. 通过SpringApplication.setDefaultProperties 指定的默认属性

以上所有形式的配置都会被加载,当存在相同配置内容时,高优先级的配置会覆盖低优先级的配置;存在不同的配置内容时,高优先级和低优先级的配置内容取并集,共同生效,形成互补配置。

二、命令行参数

Spring Boot 中的所有配置,都可以通过命令行参数进行指定,其配置形式如下。

java -jar {Jar文件名} --{参数1}={参数值1} --{参数2}={参数值2}

示例 1

  1. 在 springbootdemo 项目启动时,使用以下命令。
java -jar springbootdemo-0.0.1-SNAPSHOT.jar --server.port=8081 --server.servlet.context-path=/bcb

命令行参数说明如下:

–server.port:指定服务器端口号;
–server.servlet.context-path:指定上下文路径(项目的访问路径)。

执行结果如下图。
在这里插入图片描述

配置文件
Spring Boot 启动时,会自动加载 JAR 包内部及 JAR 包所在目录指定位置的配置文件(Properties 文件、YAML 文件),下图中展示了 Spring Boot 自动加载的配置文件的位置及其加载顺序,同一位置下,Properties 文件优先级高于 YAML 文件。

在这里插入图片描述

说明如下:

  1. /myBoot:表示 JAR 包所在目录,目录名称自定义;
  2. /childDir:表示 JAR 包所在目录下 config目录的子目录,目录名自定义;
  3. JAR:表示 Spring Boot 项目打包生成的 JAR;
  4. 其余带有“/”标识的目录的目录名称均不能修改。
  5. 红色数字:表示该配置文件的优先级,数字越小优先级越高。

这些配置文件的优先级顺序,遵循以下规则:

  1. 先加载 JAR 包外的配置文件,再加载 JAR 包内的配置文件;
  2. 先加载 config 目录内的配置文件,再加载 config 目录外的配置文件;
  3. 先加载 config 子目录下的配置文件,再加载 config 目录下的配置文件;
  4. 先加载 appliction-{profile}.properties/yml,再加载application.properties/yml;
  5. 先加载 .properties 文件,再加载 .yml 文件。

示例 2

  1. 创建一个名为 mybootdemo 的 Spring Boot 项目,并在src/main/resoources下创建以下4个配置文件。

application.yml:默认配置
application-dev.yml:开发环境配置
application-test.yml:测试环境配置
application-prod.yml:生产环境配置

1)在 applcation.yml 文件中,指定默认服务端口号(port)为 “8080”,上下文路径(context-path)为“/mybootdemo”,并激活开发环境(dev)的 profile。

server:
  port: 8080 #端口号
  servlet:
    context-path: /mybootdemo #上下文路径或项目访问路径
spring:
  profiles:
    active: dev #激活开发环境配置

2)在 application-dev.yml 中,指定开发环境端口号为 “8081”,上下文路径为“/in-dev”,配置如下。

server:
  port: 8081 #开发环境端口号 8081
  servlet:
    context-path: /in-dev #开发环境上下文路径为 in-dev
spring:
  config:
    activate:
      on-profile: dev #开发环境

3)在 application-test.yml 中,指定测试环境端口号为 “8082”,上下文路径为“/in-test”,配置如下。

#测试环境配置
server:
  port: 8082 #测试环境端口 8082
  servlet:
    context-path: /in-test #测试环境上下文路径 /in-test
spring:
  config:
    activate:
      on-profile: test

4)在 application-prod.yml 中,指定生产环境端口号为 “8083”,上下文路径为“/in-prod”,配置如下。

#生产环境配置
server:
  port: 8083 #端口号
  servlet:
    context-path: /in-prod #上下文路径
spring:
  config:
    activate:
      on-profile: prod
  1. 执行以下 mvn 命令,将 mybootdemo 打包成 JAR,并将该 JAR 包移动到本次磁盘的某个目录下(例如 mySpringBoot 目录)。
mvn clean package
  1. 在 JAR 包所在目录下创建 application.yml ,并设置上下文路径为“/out-default”,并激活生产环境(prod)Profile。
#JAR 包外默认配置
server:
  servlet:
    context-path: /out-default
#切换配置
spring:
  profiles:
    active: prod #激活开发环境配置

打开命令行窗口,跳转到 mySpringBoot 目录下,执行以下命令启动 Spring Boot。

java -jar mybootdemo-0.0.1-SNAPSHOT.jar

启动结果如下图。
在这里插入图片描述

三、示例分析

  1. Spring Boot 在启动时会加载全部的 5 个配置文件,其中位于 JAR 包外的 application.yml 优先级最高;
  2. 在 JAR 包外的 application.yml 中,配置激活了生产环境(prod)Profile,即 JAR 包内部的 application-prod.yml 生效。此时,该项目中的配置文件优先级顺序为:JAR 包外 3. application.yml >
    JAR 包内 application-prod.yml >JAR 包内其他配置文件; application-prod.yml
    的配置内容会覆盖 JAR
    包内所有其他配置文件的配置内容,即端口号(port)为“8083”,上下文路径(context-path)为“/in-prod”;
  3. JAR 包内的 application-prod.yml 中的上下文路径会被 JAR 包外的 application.yml 覆盖为“/out-default”;
  4. JAR 包内的 application-prod.yml 与 JAR 包外的 application.yml,形成互补配置,即,端口号为“8083”,上下文路径为“/out-default”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/623711.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习因子库及特征表达式,创业板布林带突破策略,年化13.3%(附代码)

原创文章第235篇,专注“个人成长与财富自由、世界运作的逻辑与投资"。 昨天有朋友留言说,L2R效果不好,当然我不知道这位兄弟的场景。 pybroker vs qlib pybroker的结构里,有一个特别的地方: 无论是规则型策略…

接口测试 —— 接口测试的意义

1、接口测试的意义(优势) (1)更早的发现问题: 不少的测试资料中强调,测试应该更早的介入到项目开发中,因为越早的发现bug,修复的成本越低。 然而功能测试必须要等到系统提供可测试…

GoogleTest之Matchers的用法

目录 组合匹配Matcher的类型转换重载函数的匹配基于参数执行不同的Actions多个参数作为一个整体匹配将Matchers作为谓词使用Matcher汇总 组合匹配 组合某些匹配某些值,可以使用以下: Matcher使用描述AllOf(m1, m2, …, mn)参数必须匹配m1, … mnAllOfA…

大数据:spark内核调度,DAG,job,宽窄依赖,stage阶段,内存计算管道,并行度task数量

大数据:spark内核调度 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其s…

【测试开发】实训记录日志

软件测试系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 了解测试开发和软件测试 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 …

建模杂谈系列226 流程与对象

说明 鲁迅说:我家门前门前有两棵树,一棵是枣树,另一棵也是枣树。 从编程语言的角度,可以分为两大类(面向过程或面向对象),可以参考这篇文章 文章的内容其实不多,我贴一下&#xff1…

spark入门 YARN模式(六)

一、背景 独立部署(Standalone)模式由 Spark 自身提供计算资源,无需其他框架提供资源。这 种方式降低了和其他第三方资源框架的耦合性,独立性非常强。但是你也要记住,Spark 主 要是计算框架,而不是资源调度…

CATIA软件各版本区别

之前有个朋友问catia v5r21和catia v5-6r 2011,有什么区别,是一样的吗? 众联亿诚才发现,很多朋友似乎看不懂CATIA各种版本各种型号,那么今天,众联亿诚就来详细解释一下,希望能帮助朋友们解答心…

苹果电脑磁盘诊断工具 SMART Utility for mac

SMART Utility for mac是一款Mac上磁盘诊断工具,能够自动检测磁盘的状态和错误情况,分析并提供错误报告,以直观的界面让用户可明确地知道自己的磁盘状况。SMART Utilitymac版支持普通硬盘HDD和固态硬盘SSD,能够显示出详细的磁盘信息&#xff…

版权中心改革之后,软著办理需要多少钱?

版权中心改革之后,软著办理需要多少钱? 众所周知版权中心2年改了3次,每次改革官费都会涨,最近一次是在4月份,官费涨了近一倍。 其实费用涨了还不算最坏的情况,主要是每次改革办理软著的难度都会增加很多。…

(antD)vue项目使用图标

(antD)vue项目使用图标 效果&#xff1a; <a-icon type"arrow-left" class"backBtn" v-if"cardDiv" click"backBtn" />.backBtn {color&#xff1a;#ccc;font-size: 20px;//图标大小 }

程序员爬虫Scrapy框架知识学习

Scrapy是一个Python编写的高级网络爬虫框架&#xff0c;它可以帮助开发者快速、高效地从网站上获取数据。以下是学习Scrapy框架的一些步骤和建议&#xff1a; 学习Python基础知识&#xff1a;Scrapy是用Python编写的&#xff0c;因此需要掌握Python的基础知识&#xff0c;包括语…

利用彩虹线课程中的知识来制作精美的渐变色块和彩虹字

彩虹字 像这样的效果,同样我们可以使用“渐变色”的技巧。来看下面如何操作 选中字体,然后鼠标右键选”设置型状格式“ 选择“渐变” 有两处决定了彩虹字的样式。 拖动的箭头,这个箭头代表“每一个段”显示的色彩,如我DEMO中的字体是“两段颜色”-蓝+黄组合出来的;角度,…

在本地环境搭建GPT项目

先看效果: 在本地环境搭建gpt项目 1.简介 忽略不能写 2.准备环境 Docker的介绍和安装 Docker是一个开源的容器化平台,它可以帮助开发者和运维人员轻松地构建、打包和部署应用程序。使用Docker,您可以将应用程序及其所有依赖项打包到一个称为容器的独立单元中,使其可…

创新与互动的科技盛宴:探索3DVR元宇宙赛博科技世界虚拟展

导语&#xff1a; 在现代科技迅猛发展的时代&#xff0c;3DVR元宇宙虚拟展厅为我们带来了一场前所未有的科技盛宴。特别是在赛博科技领域&#xff0c;它展现了一系列令人惊叹的优势、优点和实质性的作用&#xff0c;为客户带来了非凡的体验和无限的可能。 一&#xff0e;创新科…

在windows上用gpu训练paddleocr模型所有遇到的坑与解决办法

这里写自定义目录标题 1.首先拉取paddleocr源代码下载预训练模型2.开始训练更改yml配置文件 3.遇到的报错1.ModuleNotFoundError: No module named Polygon2.最难解决的No module named lanms3.ImportError: cannot import name _print_arguments from paddle.distributed.util…

利用scikit-plot可视化机器学习模型!

关注“Python专栏”微信公众号&#xff0c;回复暗号【面试大全】&#xff0c;立即领取面试题简历模板。 scikit-learn (sklearn)是Python环境下常见的机器学习库&#xff0c;包含了常见的分类、回归和聚类算法。在训练模型之后&#xff0c;常见的操作是对模型进行可视化&#…

这么坑?3年经验我要25K,结果只给15K····

2023找到一份满意的工作实在是太难了呀&#xff0c;面试了十几家公司&#xff0c;没有一个满意的offer 我的情况 大概介绍一下个人情况&#xff0c;女&#xff0c;本科&#xff0c;三年多测试工作经验&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xf…

北漂5年终上岸,年薪40W并非遥不可及····

关于我&#xff0c;普通二本&#xff0c;非计算机专业&#xff0c;培训出身&#xff0c;北漂&#xff0c;五年多的工作经验&#xff0c;做过外包&#xff0c;中间有过频繁的跳槽经历&#xff0c;手工点点点为主&#xff0c;最近确认了新Offer&#xff0c;远程办公&#xff0c;涨…

C++ Release版软件 程序运行丢失MSVCR120D.dll的解决方法

软件在Debug模式下运行时正常的&#xff0c;但是切换到Release模式下就弹出错误提示&#xff1a;无法启动此程序&#xff0c;因为计算机中丢失MSVCR120D.dll。尝试重新安装该程序以解决此问题。 解决方法如下&#xff1a; 1、项目“属性”---->配置给为“Release”版本----&…