SpringBoot配置加载顺序

2023-11-10

前言

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”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot配置加载顺序 的相关文章

随机推荐

  • 机械手使用者坐标系和工具坐标系_发那科机器人应用-坐标系介绍(2)

    工具坐标系 由工具中心点 的位置 和工具的姿势 构成 工具中心点 的位置 通过相对机械接口坐标系的工具中心点的坐标值 来定义 工具的姿势 通过机械接口坐标系的 轴 轴 轴周围的回转角 来定义 工具中心点用来对位置数据的位置进行示教 在进行工
  • Linux系列:Linux中如何安装.rpm、.tar、.tar.gz和tar.bz2文件

    我以下面三个包为例 三个包都在 etc opt下 A example 1 2 3 1 rpm B example 1 2 3 1 tar C example 1 2 3 1 tar gz 1 安装rpm包 说起RPM REDHAT Pack
  • 关于QtCreator 4.8 创建工程时,选中创建界面(.ui)无法创建工程问题

    在主界面一次选中 help gt about plugins 然后在弹出界面中找到QtCreator 在Designer右侧的的方框中打钩 然后close界面 重启软件 搞定 很简单的设置 浪费了好长时间
  • 芯片设计制造全过程

    芯片设计制造全过程 将一颗芯片从0到1 可以分为芯片设计和芯片制造两部分 芯片设计对应市场上一些fabless公司 这类公司只做芯片设计 而芯片制造对应的是foundary 比如国内的smic TSMC 国外的Samsung GlobalF
  • 分布式系统的接口幂等性设计

    什么是幂等性 就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的 不会因为多次点击而产生了其他的结果 在 CRUD 这 4 个操作中 查询操作是天然幂等的 删除操作也只会删除一次 多次的删除操作结果还是一样 影响幂等的只有在添加和
  • 服务器考试系统推荐,如何挑选并发性好的在线考试系统?

    原标题 如何挑选并发性好的在线考试系统 并发性是在线考试系统的核心指标之一 不同的在线考试系统之间可能功能上看似差异不大 但并发性不同就会使得使用体验悬若霄壤 如何挑选并发性好的在线考试系统呢 最好的办法还是通过具体的使用来进行判断 什么是
  • ConstraintLayout 使用详解

    在安卓开发过程中除了一些列的逻辑代码程序以外 UI界面也是很重要的组成部分 对于用户来说界面更是一个应用的所有 所有的操作和交互都是在UI发生 对于开发者来说UI的加载和绘制对应用的计算和内存的影响更是不容忽视 下面看一组界面 这个布局很简
  • 线程池使用和自定义线程池

    目录 1 线程基础概述 1 1 线程池的作用 1 2 为什么要用线程池 1 3 比较重要的几个类 1 4 new Thread的弊端 2 四种线程池 2 1 源码分析 2 2 RejectedExecutionHandler 线程池四种拒绝
  • subversion强制写log的windows 和linux hooks脚本

    windows code echo offsetlocalset REPOS 1set TXN 2rem check that logmessage contains at least 10 characterssvnlook log RE
  • Tinyid原理介绍

    Id生成系统要点 在简单系统中 我们常常使用db的id自增方式来标识和保存数据 随着系统的复杂 数据的增多 分库分表成为了常见的方案 db自增已无法满足要求 这时候全局唯一的id生成系统就派上了用场 当然这只是id生成其中的一种应用场景 那
  • MYSQL 中的表空间

    MYSQL中的表空间 MYSQL 的表空间可以理解为其存储在物理磁盘上的 表名 ibd 文件 MYSQL 为了管理方便 增加了很多概念 来一一了解一下 逻辑概念 Segment 在 B 树的根页面的中 存储了两个 10 字节的字段 PAGE
  • vue实现动态锚点

    监听滚动事件 实现动态锚点 参考 Vue监听滚动实现锚点定位 双向
  • 科技赋能企业,实现数字化转型

    科技是第一生产力 数字技术即科技 可以改变传统的商业模式 为各行各业注入新的活力 推动企业数字化转型 可是实现行业的效率提升 实现跨界重组 重构产业模式 为产业格局重新赋能 最终实现企业产能升级 一 科技赋能意义重大 科技赋能企业 为我国经
  • 通过springboot autoconfig分析bean实例化过程的案例

    分析案例前提所参考的例子 Spring Boot中的自定义start pom SpringBoot学习笔记 3 Spring Boot 运行原理 自动配置 然后我又看了下nacos的源码 发现原来也都是这做的截图如下 当然最终的目的我是想知
  • 使用Navicat Premium 同步 测试数据库 与 正式数据库 数据

    目录标题 使用Navicat Premium 同步 测试数据库 与 正式数据库 数据 使用Navicat Premium 同步 测试数据库 与 正式数据库 数据 步骤 1 使用 Navicat 打开连接 2 打开 工具 gt 结构同步 3
  • Linux中root用户找不到JAVA_HOME

    Linux中root用户找不到JAVA HOME 在Ubuntu环境中安装好Java环境后设置环境变量 在 etc profile中设置好了JAVA HOME变量并引入到PATH中 用于Ubuntu默认是不以root用户登录的 这时echo
  • kubernetes1.24版本部署+containerd运行时(弃用docker)

    背景介绍 kubernetes 1 24版本正式弃用docker 开始使用containerd作为容器运行时 运行时介绍 OCI Open Container Initiative 2015年Google docker Redhat IBM
  • 云原生之使用docker部署centos系统测试环境

    云原生之使用docker部署centos系统测试环境 一 检查本地服务器系统版本 二 检查docker版本 三 检查docker状态 四 下载centos镜像 五 创建centos容器 1 运行centos容器 2 检查容器内根目录 六 c
  • 使用广泛的开源PCB文件查看器 Gerbv 含多个严重漏洞

    聚焦源代码安全 网罗国内外最新资讯 编译 代码卫士 专栏 供应链安全 数字化时代 软件无处不在 软件如同社会中的 虚拟人 已经成为支撑社会正常运转的最基本元素之一 软件的安全性问题也正在成为当今社会的根本性 基础性问题 随着软件产业的快速发
  • SpringBoot配置加载顺序

    目录 前言 一 Spring Boot 配置优先级 二 命令行参数 三 示例分析 前言 Spring Boot 不仅可以通过配置文件进行配置 还可以通过环境变量 命令行参数等多种形式进行配置 这些配置都可以让开发人员在不修改任何代码的前提下