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

Spring Boot 配置文件加载优先级全解析

精心整理了最新的面试资料和简历模板,有需要的可以自行获取

点击前往百度网盘获取
点击前往夸克网盘获取


Spring Boot 配置文件加载优先级全解析

Spring Boot 的配置文件加载机制是开发者管理不同环境配置的核心功能之一。其通过外部化配置(Externalized Configuration)支持从多种来源加载配置属性,并按照明确的优先级顺序进行覆盖。本文将从基础概念、优先级顺序、配置源解析到最佳实践,全面梳理 Spring Boot 的配置加载规则。


一、Spring Boot 配置加载的核心原则

Spring Boot 的配置加载遵循两个核心原则:

  1. 优先级覆盖:高优先级配置源的属性会覆盖低优先级的同名属性。
  2. 互补配置:不同配置源的属性可以互补,仅当存在同名属性时才会触发覆盖逻辑。

二、配置源及其优先级顺序

以下是 Spring Boot 支持的配置源及其从高到低的优先级顺序(基于 Spring Boot 2.7+):

优先级配置源说明
1命令行参数(Command Line Args)通过 --key=value 传递,如 java -jar app.jar --server.port=8081
2SPRING_APPLICATION_JSON环境变量或系统属性中的 JSON 格式配置(支持内联或文件路径)
3JNDI 属性(java:comp/env从 JNDI 上下文获取的配置
4ServletConfig 初始化参数web.xml 或 Servlet 3+ 的 @WebServlet 中定义的参数
5ServletContext 初始化参数类似 ServletConfig,但作用于整个应用上下文
6JVM 系统属性(-D参数)-Dspring.datasource.url=jdbc:mysql://localhost/db
7操作系统环境变量export SERVER_PORT=8081(需转换为大写+下划线格式)
8Profile-specific 配置文件application-{profile}.propertiesapplication-{profile}.yml
9默认配置文件项目中的 application.propertiesapplication.yml
10@PropertySource 注解@Configuration 类上通过注解加载的配置文件
11默认属性(SpringApplication.setDefaultProperties通过代码设置的默认属性

三、关键配置源详解
1. 命令行参数
  • 最高优先级,适合临时覆盖配置。
  • 示例:java -jar app.jar --server.port=9090 --logging.level.root=DEBUG
2. 环境变量
  • 常用于容器化部署(如 Docker/K8s)。
  • 属性名需转换为大写+下划线,如 spring.datasource.urlSPRING_DATASOURCE_URL
3. Profile-specific 配置文件
  • 通过 spring.profiles.active 激活指定 Profile。
  • 文件命名格式为 application-{profile}.yml,如 application-dev.yml
  • Profile 配置优先级高于默认配置,但低于更高级别的配置源。
4. 默认配置文件
  • application.yml 优先级高于 application.properties(若两者存在同名属性)。
  • 支持从以下位置加载(按优先级排序):
    1. 项目根目录的 /config 子目录
    2. 项目根目录
    3. Classpath 下的 /config 目录
    4. Classpath 根目录
5. @PropertySource
  • 用于加载自定义配置文件,但优先级较低。
  • 示例:
    @Configuration
    @PropertySource("classpath:custom.properties")
    public class AppConfig { }
    

四、版本差异与注意事项
  1. Spring Boot 2.4+ 的变化

    • 废弃了 spring.config.locationspring.config.additional-location 的部分行为。
    • 支持 spring.config.import 显式导入配置(如 spring.config.import=configtree:/etc/config/)。
  2. 多文档 YAML 文件

    • 可在单个 YAML 文件中通过 --- 分隔不同 Profile 的配置。
    • 示例:
      server:port: 8080
      ---
      spring:profiles: dev
      server:port: 8081
      

五、最佳实践
  1. 按环境分离配置

    • 使用 application-dev.ymlapplication-prod.yml 管理不同环境。
    • 通过 spring.profiles.active=dev 激活 Profile。
  2. 优先使用外部化配置

    • 避免硬编码配置,将敏感信息(如数据库密码)通过环境变量或云平台密钥管理服务注入。
  3. 谨慎使用命令行参数

    • 仅用于临时调试,生产环境建议通过环境变量或配置文件管理。
  4. 自定义配置位置

    • 启动时指定 --spring.config.location=classpath:/default/,file:./external-config/

六、常见问题
  1. 属性未生效?

    • 检查是否有更高优先级的配置源覆盖了当前配置。
    • 使用 Environment 端点(需开启 management.endpoints.web.exposure.include=env)查看最终生效的配置。
  2. 多 Profile 如何叠加?

    • 同时激活多个 Profile(如 spring.profiles.active=dev,db-mysql),配置会按字母顺序加载并合并。
  3. 如何禁用默认配置文件?

    • 设置 spring.config.name=__dummy__(加载一个不存在的文件)。

七、总结

Spring Boot 的配置加载机制通过灵活的优先级规则,为多环境配置管理提供了强大支持。理解其加载顺序和覆盖逻辑,能够帮助开发者避免配置冲突,提升应用的可维护性。在实际项目中,建议结合容器化部署和配置中心(如 Spring Cloud Config),实现更高效的配置管理。

相关文章:

Spring Boot 配置文件加载优先级全解析

精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Spring Boot 配置文件加载优先级全解析 Spring Boot 的配置文件加载机制是开发者管理不同环境配置的核心功能之一。其通过外部化配置(Externaliz…...

解决华硕主板Z890m下载ubuntu20.04后没有以太网问题

问题描述: 华硕主板Z890m下载双系统ubuntu20.04后,发现ubuntu不能打开以太网。 问题原因: 华硕主板的网卡驱动是r8125,而ubuntu20.04的驱动版本是r8169,所以是网卡驱动不匹配造成 解决方案 开机界面按下F2进入BOIS模式&#…...

xLua的Lua调用C#的2,3,4

使用Lua在Unity中创建游戏对象,组件: 相关代码如下: Lua --Lua实例化类 --C# Npc objnew Npc() --通过调用构造函数创建对象 local objCS.Npc() obj.HP100 print(obj.HP) local obj1CS.Npc("admin") print(obj1.Name)--表方法希…...

Debian系统_主板作为路由器_测试局域网设备间网速

Debian系统_主板作为路由器_测试局域网设备间网速 一、360软件测网速 360测出来的网速实际上是宽带的速度,并不是路由器LAN口到电脑这一段的网速 二、使用iperf3 进行双向带宽测试 1、开发板端下载软件 //Debian系统或者/Ubuntu sudo apt update && sudo…...

从 macos 切换到 windows 上安装的工具类软件

起因 用了很多年的macos, 已经习惯了macos上的操作, 期望能在windows上获得类似的体验, 于是花了一些时间来找windows上相对应的软件. 截图软件 snipaste​​​​​​ windows和macos都有的软件, 截图非常好用 文件同步软件 oneDrive: 尝试了不同的同步软件, 还是微软在各…...

JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)

目录 JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码) 一、什么时候该使用Array.map()&#xff0…...

去除Mysql表中的空格、回车、换行符和特殊字符

系列文章目录 文章目录 系列文章目录前言一、示例1.sql层面2.java层面 前言 一、示例 1.sql层面 参考 ## 例子1 ## CHAR(10) 表示换行符 ## CHAR(13) 表示回车UPDATE 表名 SET 列名 REPLACE(REPLACE(列名, CHAR(10), ), CHAR(13), )## 例子2 ## 删除字段中的空格、换行符、…...

P9242 [蓝桥杯 2023 省 B] 接龙数列

这道题说要求最少删多少个使剩下的序列是接龙序列,这个问题可以转换为序列中最长的接龙序列是多少,然后用总长度减去最长接龙序列的长度就可以了,在第一个暴力版本的代码中我用了两个for循环求出了所有的接龙序列的长度,但是会超时…...

macos下 ragflow二次开发环境搭建

参考官网链接 https://ragflow.io/docs/dev/launch_ragflow_from_source虚拟环境 git clone https://github.com/infiniflow/ragflow.git cd ragflow/ # if not pipx, please install it at first pip3 install pipxpipx install uv uv sync --python 3.10 --all-extras 安装 …...

SQL优化技术分享:从 321 秒到 0.2 秒的性能飞跃 —— 基于 PawSQL 的 TPCH 查询优化实战

在数据库性能优化领域,TPC-H 测试集是一个经典的基准测试工具,常用于评估数据库系统的查询性能。本文将基于 TPCH 测试集中的第 20个查询,结合 PawSQL 自动化优化工具,详细分析如何通过 SQL 重写和索引设计,将查询性能…...

密码学基础——DES算法

前面的密码学基础——密码学文章中介绍了密码学相关的概念,其中简要地对称密码体制(也叫单钥密码体制、秘密密钥体制)进行了解释,我们可以知道单钥体制的加密密钥和解密密钥相同,单钥密码分为流密码和分组密码。 流密码&#xff0…...

在 Linux 终端中轻松设置 Chromium 的 User-Agent:模拟手机模式与自定义浏览体验

在 Linux 系统中,通过终端灵活控制 Chromium 的行为可以大幅提升工作效率。本文将详细介绍如何通过命令行参数和环境变量自定义 Chromium 的 User-Agent,并结合手机模式模拟,实现更灵活的浏览体验。 为什么需要自定义 User-Agent?…...

ChatGPT 4:引领 AI 创作新时代

文章目录 前言一、ChatGPT 4 的技术革新二、AI 文案创作:精准生成与个性化定制三、AI 绘画艺术:从文字到图像的神奇转化四、AI 视频制作:自动化剪辑与创意实现五、知识库与 ChatGPT 4 的深度融合六、全新的变革和机遇七、相关书籍推荐《ChatG…...

http页面的加载过程

HTTP/2 核心概念 1.1 流(Stream) • 定义:HTTP/2 连接中的逻辑通道,用于传输数据,每个流有唯一标识符(Stream ID)。 • 特点: ◦ 支持多路复用(多个流并行传输&#…...

MySQL【8.0.41版】安装详细教程--无需手动配置环境

一、MySQL 介绍 1. 概述 MySQL 是一个开源的关系型数据库管理系统,由瑞典公司 MySQL AB 开发,现属于 Oracle 旗下。它基于 SQL(结构化查询语言)进行数据管理,支持多用户、多线程操作,广泛应用于 Web 应用、…...

鸿蒙ArkTS实战:从零打造智能表达式计算器(附状态管理+路由传参核心实现)

还在为组件状态混乱、页面跳转丢参数而头疼? 这篇博客将揭秘如何用鸿蒙ArkTS打造一个漂亮美观的智能计算器: ✅ 输入完整表达式,秒出结果——字符串切割简单计算 ✅ 状态管理黑科技——Provide/Consume 实现跨组件实时响应 ✅ 路由传参实战—…...

【58】编程技巧:单片机编程命名规范

【58】编程技巧:单片机编程命名规范 引言 在大型嵌入式项目开发中,变量和常量的命名混乱会导致代码难以维护。本文系统阐述变量、常量、指针、结构体等命名规范,通过统一规则提升代码可读性与协作效率。目标是帮助开发者建立清晰的命名习惯&…...

Windows 部署项目 apache + mod_wsgi,nginx + waitress

文章目录 1、apache mod_wsgi,nginx waitress两种部署方式的区别2、以nginx waitress为例 有些项目必须部署在windows上,有IIS wfastcgi、apache mod_wsgi,nginx waitress部署方式 1、apache mod_wsgi,nginx waitress两种…...

车辆视频检测器linux版对于密码中包含敏感字符的处理方法

由于密码中含有敏感字符,导致前端页面异常,图标变灰,坐标拾取打不开图像等,主要原因是:密码比较前后不一致,左边是Abc_110,右边是:Abc_110%2B,对于此问题,特别…...

Java服务端开发基石:深入理解Spring IoC与依赖注入 (DI)

今天,我们从现代Java开发,尤其是企业级应用中,几乎无处不在的Spring框架的核心概念开始:控制反转(Inversion of Control, IoC) 与 依赖注入(Dependency Injection, DI)。理解它们&am…...

【人工智能】大语言模型多义词解析技术揭秘——以“项目“歧义消解为例

今天田辛老师和小伙伴探讨了一个有趣的多义词问题, 在人工智能技术日新月异的今天,大语言模型(LLM)对自然语言的理解能力已经达到令人惊叹的水平。大模型到底是如何去区分多义词的? 比如:当用户提到"…...

贪心算法(17)(java)可被三整除的最大整数和

给你一个整数数组 nums,请你找出并返回能被三整除的元素 最大和。 示例 1: 输入:nums [3,6,5,1,8] 输出:18 解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。 …...

qq邮箱群发程序

1.界面设计 1.1 环境配置 在外部工具位置进行配置 1.2 UI界面设计 1.2.1 进入QT的UI设计界面 在pycharm中按顺序点击,进入UI编辑界面: 点击第三步后进入QT的UI设计界面,通过点击按钮进行界面设计,设计后进行保存到当前Pycharm…...

K8S学习之基础七十九:关闭istio功能

关闭istio功能 kubectl get ns --show-labels kubectl label ns default istio-injection-有istio-injectionenabled的命名空间,pod都会开启istio功能 反之,如果要开启istio,在对应命名空间打上该标签即可...

上门预约洗鞋店小程序都具备哪些功能?

现在大家对洗鞋子的清洗条件越来越高,在家里不想去,那就要拿去洗鞋店去洗。如果有的客户没时间去洗鞋店,这个时候,有个洗鞋店小程序就可以进行上门取件,帮助没时间的客户去取需要清洗的鞋子,这样岂不是既帮…...

在Ubuntu 22.04上配置【C/C++编译环境】

在Ubuntu 22.04上配置C/C编译环境 如果你想在Ubuntu 22.04上编译和运行C或C程序,首先需要安装一个合适的编译器和相关工具。本文将为你提供详细的安装建议和操作步骤,帮助你快速搭建开发环境。 准备工作 在开始之前,确保你的系统可以通过终…...

蓝桥杯——走迷宫(Java-BFS)

这是一个经典的BFS算法 1. BFS算法保证最短路径 核心机制:广度优先搜索按层遍历所有可能的路径,首次到达终点的路径长度即为最短步数。这是BFS的核心优势。队列的作用:通过队列按先进先出的顺序处理节点,确保每一步探索的都是当…...

Spring MVC与Spring Boot文件上传配置差异对比及文件上传关键类详细说明与对比

一、Spring MVC与Spring Boot文件上传配置差异对比 1. 配置方式差异 框架配置方式依赖管理自动配置Spring MVC需手动配置MultipartResolver(如StandardServletMultipartResolver)需自行引入commons-fileupload等依赖无,默认不启用文件上传支…...

LLM 的model.generate() 参数说明

LLM 的model.generate() 参数说明 目录 LLM 的model.generate() 参数说明生成长度控制参数采样策略参数重复惩罚参数束搜索参数其他参数model.generate() 方法是 Hugging Face Transformers 库中用于文本生成的核心方法,它有众多参数可用于控制生成过程 生成长度控制参数 min…...

下载firefox.tar.xz后如何将其加入到Gnome启动器

起因:近期(2025-04-07)发现firefox公布了130.0 版本,可以对pdf文档进行签名了,想试一下,所以卸载了我的Debian12上的firefox-esr,直接下载了新版本的tar.xz 包。 经过一番摸索,实现了将其加入Gn…...