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

Spring Boot配置文件优先级全解析:如何优雅覆盖默认配置?

📚 一、为什么需要了解配置文件优先级?

想象一下,你正在玩一个游戏🎮,游戏里有默认设置,但你可以通过不同的方式修改这些设置:

  1. 游戏内置的默认设置(就像Spring Boot的默认配置)
  2. 全局配置文件(就像游戏的设置菜单)
  3. 特定场景的特殊设置(就像某个关卡的特殊规则)

Spring Boot的配置文件也是这样层层叠加的!理解它们的优先级,你就能像游戏高手一样精准控制应用的行为了!😎

🎯 二、Spring Boot配置文件全家福

Spring Boot支持多种格式的配置文件,主要有:

  1. .properties文件(传统格式)

    server.port=8080
    
  2. .yml.yaml文件(更简洁的格式)

    server:port: 8080
    
  3. 环境变量

  4. 命令行参数

这些配置可以同时存在,那Spring Boot怎么决定用哪个呢?这就是优先级的奥秘啦!🔍

🏆 三、配置文件优先级完整排行榜

来啦来啦!最关键的优先级排行榜!从高到低依次是:

  1. 命令行参数 👑王者级别

    java -jar myapp.jar --server.port=9090
    
  2. 来自java:comp/env的JNDI属性 (不太常用)

  3. Java系统属性(System.getProperties())

    java -Dserver.port=9090 -jar myapp.jar
    
  4. 操作系统环境变量 💻

    export SERVER_PORT=9090
    
  5. 仅在打包的jar外部的特定profile的应用配置文件

    • application-{profile}.propertiesapplication-{profile}.yml
    • 放在jar包同目录下的config子目录中
  6. 仅在打包的jar外部的特定profile的应用配置文件

    • 直接放在jar包同目录下
  7. 打包在jar内的特定profile的应用配置文件

    • 也就是resources目录下的application-{profile}.propertiesyml
  8. 打包的jar外部的应用配置文件

    • application.propertiesapplication.yml
    • 放在jar包同目录下的config子目录中
  9. 打包的jar外部的应用配置文件

    • 直接放在jar包同目录下
  10. 打包在jar内的应用配置文件

    • 也就是resources目录下的application.propertiesyml
  11. @Configuration类上的@PropertySource注解 🏷️

    @PropertySource("classpath:custom.properties")
    
  12. SpringApplication.setDefaultProperties设置的默认属性

哇!是不是有点多?别担心,我们慢慢来分解理解~ 😊

🧩 四、实际应用场景解析

场景1:开发环境 vs 生产环境

假设我们有一个数据库配置:

  1. 默认配置 (application.yml)

    spring:datasource:url: jdbc:mysql://localhost:3306/dev_dbusername: dev_userpassword: dev_pass
    
  2. 生产环境配置 (application-prod.yml)

    spring:datasource:url: jdbc:mysql://prod-server:3306/prod_dbusername: prod_userpassword: ${DB_PASSWORD}  # 从环境变量获取
    

启动时使用:

java -jar app.jar --spring.profiles.active=prod

这样,生产环境就会自动使用生产配置啦!🎉

场景2:临时覆盖配置

有时候我们需要临时修改某个配置,比如端口号:

java -jar app.jar --server.port=9090

这样命令行参数会覆盖所有文件中的配置,超级方便!✨

🔍 五、深度解析:属性覆盖机制

Spring Boot使用一个叫PropertySource的抽象概念来管理这些配置。当需要获取一个属性值时,它会按照优先级顺序查找,找到第一个匹配的就停止。

举个🌰:

  1. 假设在application.yml中:

    server:port: 8080
    
  2. 同时在环境变量中设置了:

    export SERVER_PORT=9090
    
  3. 启动命令:

    java -jar app.jar --server.port=7070
    

最终端口会是哪个呢?没错,是7070!因为命令行参数优先级最高!🏆

🛠️ 六、如何正确覆盖配置:最佳实践

1. 多环境配置

推荐使用profile机制:

# application.yml
spring:profiles:active: dev  # 默认使用dev环境# application-dev.yml (开发环境)
server:port: 8080# application-prod.yml (生产环境)
server:port: 80

启动时指定profile:

java -jar app.jar --spring.profiles.active=prod

2. 敏感信息处理

千万不要把密码等敏感信息直接写在配置文件中!🙅‍♂️

推荐做法:

spring:datasource:password: ${DB_PASSWORD}

然后通过环境变量设置:

export DB_PASSWORD=mysecretpassword

3. 外部化配置

把配置文件放在jar包外面,方便修改:

.
├── app.jar
├── config
│   └── application.yml
└── application.yml

这样修改配置不需要重新打包!👍

💡 七、高级技巧:自定义属性源

如果你想玩点高级的,可以实现自己的PropertySource

public class CustomPropertySource extends PropertySource {public CustomPropertySource() {super("customPropertySource");}@Overridepublic Object getProperty(String name) {if ("custom.property".equals(name)) {return "我是自定义属性值";}return null;}
}

然后在配置类中注册:

@Configuration
public class AppConfig {@Autowiredprivate ConfigurableEnvironment env;@PostConstructpublic void init() {env.getPropertySources().addAfter(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,new CustomPropertySource());}
}

这样你就可以用@Value("${custom.property}")获取自定义属性啦!🎩✨

🧪 八、调试技巧:查看实际生效的配置

想知道最终生效的配置是什么?有几种方法:

  1. Actuator端点 (如果引入了actuator)

    http://localhost:8080/actuator/env
    
  2. 启动时打印
    application.yml中添加:

    logging:level:org.springframework.boot.context.properties: DEBUG
    
  3. 编程方式获取

    @Autowired
    private Environment env;public void someMethod() {String port = env.getProperty("server.port");System.out.println("实际端口: " + port);
    }
    

🚨 九、常见问题与解决方案

Q1: 我的配置修改了为什么不生效?

A: 按照以下步骤检查:

  1. 确认修改的文件在优先级更高的位置
  2. 检查是否有拼写错误
  3. 确认没有更高优先级的配置覆盖了它
  4. 检查profile是否激活正确

Q2: yml和properties文件哪个优先级高?

A: 如果同名,.properties优先级高于.yml。但最好统一使用一种格式。

Q3: 如何禁用某个配置文件的加载?

A: 使用:

java -jar app.jar --spring.config.location=optional:file:/path/to/config/

Q4: 配置属性名中的横线(-)和下划线(_)有什么区别?

A: Spring Boot会自动将my.property-namemy.property_name视为相同属性,方便使用。

🌈 十、实战演练:完整示例

让我们通过一个完整例子巩固所学:

  1. 项目结构

    src/main/resources/application.yml          # 默认配置application-dev.yml      # 开发环境application-prod.yml     # 生产环境
    target/myapp.jar
    config/application.yml              # 外部覆盖配置
    
  2. application.yml

    spring:profiles:active: dev
    app:name: MyAppversion: 1.0.0
    
  3. application-dev.yml

    server:port: 8080
    db:url: jdbc:mysql://localhost:3306/dev
    
  4. application-prod.yml

    server:port: 80
    db:url: jdbc:mysql://prod-server:3306/prod
    
  5. config/application.yml (外部配置)

    app:version: 1.0.1  # 覆盖版本号
    
  6. 启动命令

    java -jar myapp.jar --spring.profiles.active=prod --server.port=9090
    
  7. 最终生效的配置

    • server.port: 9090 (命令行参数最高)
    • app.name: MyApp (默认配置)
    • app.version: 1.0.1 (外部配置覆盖)
    • db.url: jdbc:mysql://prod-server:3306/prod (prod profile)

完美!现在你完全掌握了配置覆盖的艺术!🎨

📝 十一、总结:配置优先级核心要点

让我们用一张表格总结关键点:

优先级配置来源示例适用场景
最高命令行参数--server.port=9090临时测试、运维调整
环境变量export SERVER_PORT=9090容器部署、敏感信息
外部配置文件/config/application.yml生产环境配置
jar内配置文件resources/application.yml默认配置、开发环境
最低默认属性SpringApplication.setDefaultProperties框架默认值

记住这个口诀:“命环外jar默认”(命令行>环境变量>外部文件>jar内文件>默认)!🗣️

🎁 十二、Bonus:Spring Boot 2.4+配置新特性

如果你使用Spring Boot 2.4及以上版本,还有一些新玩法:

  1. 配置文件分组

    spring:profiles:group:production: db,redis
    

    启动production相当于同时激活db和redis profile

  2. 导入额外配置

    spring:config:import: optional:file:/path/to/config/
    
  3. 多文档YAML文件
    可以在一个yml文件中用---分隔多个profile配置

🚀 十三、举一反三:其他相关知识点

理解了配置优先级,这些相关概念也更容易掌握:

  1. @Value注解:直接从环境获取属性值

    @Value("${server.port}")
    private int port;
    
  2. @ConfigurationProperties:类型安全的配置绑定

    @ConfigurationProperties(prefix = "app")
    public class AppProperties {private String name;private String version;// getters/setters
    }
    
  3. Spring Cloud Config:集中式配置管理

📖 十四、延伸阅读推荐

想更深入学习的同学可以参考:

  1. Spring Boot官方文档 - 外部化配置
  2. 《Spring Boot实战》 - 第3章 自定义配置
  3. 《Spring微服务实战》 - 配置管理章节

🎉 十五、结语

恭喜你!🎊 现在你已经完全掌握了Spring Boot配置文件优先级的精髓!记住:

  • 理解优先级层次是关键 🔑
  • 合理使用profile管理多环境 🌎
  • 敏感信息用环境变量保护 🔒
  • 外部化配置让运维更灵活 🛠️

如果有任何问题,欢迎在评论区留言讨论哦!😊 我们下次再见!👋

Happy Coding! 💻✨

推荐阅读文章

  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)

  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系

  • HTTP、HTTPS、Cookie 和 Session 之间的关系

  • 什么是 Cookie?简单介绍与使用方法

  • 什么是 Session?如何应用?

  • 使用 Spring 框架构建 MVC 应用程序:初学者教程

  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误

  • 如何理解应用 Java 多线程与并发编程?

  • 把握Java泛型的艺术:协变、逆变与不可变性一网打尽

  • Java Spring 中常用的 @PostConstruct 注解使用总结

  • 如何理解线程安全这个概念?

  • 理解 Java 桥接方法

  • Spring 整合嵌入式 Tomcat 容器

  • Tomcat 如何加载 SpringMVC 组件

  • “在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”

  • “避免序列化灾难:掌握实现 Serializable 的真相!(二)”

  • 如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)

  • 解密 Redis:如何通过 IO 多路复用征服高并发挑战!

  • 线程 vs 虚拟线程:深入理解及区别

  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别

  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!

  • “打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”

  • Java 中消除 If-else 技巧总结

  • 线程池的核心参数配置(仅供参考)

  • 【人工智能】聊聊Transformer,深度学习的一股清流(13)

  • Java 枚举的几个常用技巧,你可以试着用用

  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)

  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系

  • HTTP、HTTPS、Cookie 和 Session 之间的关系

  • 使用 Spring 框架构建 MVC 应用程序:初学者教程

  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误

  • Java Spring 中常用的 @PostConstruct 注解使用总结

  • 线程 vs 虚拟线程:深入理解及区别

  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别

  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!

  • 探索 Lombok 的 @Builder 和 @SuperBuilder:避坑指南(一)

  • 为什么用了 @Builder 反而报错?深入理解 Lombok 的“暗坑”与解决方案(二)

相关文章:

Spring Boot配置文件优先级全解析:如何优雅覆盖默认配置?

📚 一、为什么需要了解配置文件优先级? 想象一下,你正在玩一个游戏🎮,游戏里有默认设置,但你可以通过不同的方式修改这些设置: 游戏内置的默认设置(就像Spring Boot的默认配置&…...

医院数据中心智能化数据上报与调数机制设计

针对医院数据中心的智能化数据上报与调数机制设计,需兼顾数据安全性、效率性、合规性及智能化能力。以下为系统性设计方案,分为核心模块、技术架构和关键流程三部分: 一、核心模块设计 1. 数据上报模块 子模块功能描述多源接入层对接HIS/LIS/PACS/EMR等异构系统,支持API/E…...

Linux之基础命令

Linux作为开源操作系统的代表,以其高效、灵活和强大的命令行工具闻名。无论是系统管理、开发调试还是日常使用,掌握基础命令都是与Linux系统交互的必备技能。本文整理了20个最常用的Linux基础命令,帮助新手快速入门。 目录 目录与文件导航文…...

【MATLAB代码例程】AOA与TOA结合的高精度平面地位,适用于四个基站的情况,附完整的代码

本代码实现了一种基于到达角(AOA) 和到达时间(TOA) 的混合定位算法,适用于二维平面内移动或静止目标的定位。通过4个基站的协同测量,结合最小二乘法和几何解算,能够有效估计目标位置,并支持噪声模拟、误差分析和可视化输出。适用于室内定位、无人机导航、工业监测等场景…...

PC主板及CPU ID 信息、笔记本电脑唯一 MAC地址获取

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 PC主板及CPU ID 信息物理 MAC地址获取win11 新电脑 wmic 安装❤️ 欢迎一起学AI…...

RK3568笔记八十二: 利用AI生成的简单数据转发服务程序

若该文为原创文章,转载请注明原文出处。 测试AI编写代码能力,做了个简单的数据转发功能,后期想部署到服务器 功能相对简单,大概功能如下: 1、打开TCP服务端,等待客户端连接 2、客户端连接后发送ID:1234格式,服务端收到,解析出ID:1234并记录 3、相同的ID数据之间互…...

C++17 信号量模拟实现

C17 信号量模拟实现 一、实现原理 C17 标准库没有原生信号量(C20才有)&#xff0c;但可以通过 std::mutex std::condition_variable 模拟实现。以下是核心逻辑&#xff1a; #include <mutex> #include <condition_variable>class CountingSemaphore { private:…...

web后端语言中篇

#作者&#xff1a;允砸儿 #日期&#xff1a;乙巳青蛇年 三月十八 笔者本来打算隔一天给它更完的&#xff0c;但是事情有点多这几天&#xff0c;实在是抱歉。废话不多说直接进入正题。 PHP流程控制语句 什么是流控:流程控制语句用于决定代码的执行顺序。 #注意流程控制语句…...

Spine-Leaf 与 传统三层架构:全面对比与解析

本文将详细介绍Spine-Leaf架构&#xff0c;深入对比传统三层架构&#xff08;Core、Aggre、Access&#xff09;&#xff0c;并探讨其与Full-mesh网络和软件定义网络&#xff08;SDN&#xff09;的关联。通过通俗易懂的示例和数据中心网络分析&#xff0c;我将帮助您理解Spine-L…...

Vmware esxi 查看硬盘健康状况

起因 硬盘掉盘 - - 使用自带的命令esxcli 列出所有硬盘 esxcli storage core device list[rootlocalhost:~] esxcli storage core device list t10.NVMe____INTEL_MEMPEK1W016GAL____________________PHBT83660BYP016D____00000001Display Name: Local NVMe Disk (t10.NVMe…...

React 事件处理基础

React 中最常见的两个需求&#xff0c;一个是列表渲染&#xff0c;另一个就是绑定点击事件。 这一篇就是从最基础的按钮点击开始&#xff0c;分四个阶段&#xff0c;逐步理解 React 中事件的写法和参数传递方式。 &#x1f4cd;阶段一&#xff1a;最简单的点击事件 function A…...

pandas库详解

CONTENT 基本数据结构SeriesDataFrame 数据读取与写入读取 CSV 文件写入 CSV 文件 数据清洗处理缺失值数据类型转换 数据操作索引与切片数据合并数据分组与聚合 数据可视化 基本数据结构 Series Series 属于一维标记数组&#xff0c;由一组数据和对应的索引构成。 import pa…...

焊接机器人的设计

一、引言 随着制造业的发展&#xff0c;焊接工艺在各个领域得到广泛应用。焊接机器人具有焊接质量高、效率高、劳动强度低等优点&#xff0c;能够满足现代制造业对焊接生产的要求。设计一款性能优良的焊接机器人&#xff0c;对于提高焊接生产的自动化水平和产品质量具有重要意…...

python进阶: 深入了解调试利器 Pdb

Python是一种广泛使用的编程语言&#xff0c;以其简洁和可读性著称。在开发和调试过程中&#xff0c;遇到错误和问题是不可避免的。Python为此提供了一个强大的调试工具——Pdb&#xff08;Python Debugger&#xff09;。 Pdb是Python标准库中自带的调试器&#xff0c;可以帮助…...

4.黑马学习笔记-SpringMVC(P43-P47)

1.SpringMVC简介 SpringMVC技术&#xff08;更少的代码&#xff0c;简便&#xff09;与servlet技术功能相同&#xff0c;属于web层开发技术。 SpringMVC是一种基于java实现MVC模型的轻量级web框架。 轻量级指的是&#xff08;内存占用比较低&#xff0c;运行效率高&#xff09;…...

【文件操作与IO】详细解析文件操作与IO (一)

本篇博客给大家带来的是文件操作的知识点. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&#x1f680; 要开心要快乐顺便进步 一. …...

PMP考试费能报销吗?报销流程是什么?

最近也是到了6月和8月PMP考试的报名高峰期&#xff0c;后台有小伙伴最常问的问题就是&#xff0c;PMP考试费比较贵&#xff0c;能不能报销&#xff1f;报销流程是什么&#xff1f; 先给大家分享一下最新PMP报名消息和考试信息&#xff1a; 添加图片注释&#xff0c;不超过 140…...

机器学习05-CNN

CNN&#xff08;卷积神经网络&#xff09;学习文档 一、引言 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是深度学习中的一种重要网络结构&#xff0c;在图像识别、计算机视觉等领域取得了巨大成功。CNN 的设计灵感来源于生物视觉系统…...

c++ string构造函数和assign函数

c string构造函数和assign函数 #include <iostream> #include <stdlib.h> #include <string> #include <string.h>int main() {char buff[10] {a,b,c,d,e,f,g,h,i,\0};std::string str1;str1.assign(&buff[0],0,10);int length str1.length();i…...

学习threejs,使用EffectComposer后期处理组合器(采用RenderPass、GlitchPass渲染通道)

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.EffectComposer 后期…...

物联网通信协议——TCP与MQTT的对比

在物联网通信中&#xff0c;MQTT和TCP的实现方式和原理完全不同&#xff0c;因为两者属于协议栈的不同层级&#xff0c;解决的问题也不同。以下从协议层级、工作机制和典型场景三个角度详细解释&#xff1a; 1. 协议层级与定位 特性TCPMQTT协议层级传输层&#xff08;第4层&am…...

docker部署springboot(eureka server)项目

打jar包 使用maven&#xff1a; <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>17</source><target>17&…...

第 7 期:DDPM 采样提速方案:从 DDPM 到 DDIM

本期关键词:采样加速、DDIM 推导、可控性提升、伪逆过程、代码实战 前情回顾:DDPM 的采样瓶颈 在前几期中,我们构建了一个完整的 DDPM 生成流程。但是你可能已经发现: 生成一张图像太慢了!!! 原因是: DDPM 要在 T 个时间步中一步步地去噪,从 x_T → x_0。而通常 T 至…...

1panel第三方应用商店(本地商店)配置和使用

文章目录 引言资源网站实战操作说明 引言 1Panel 提供了一个应用提交开发环境&#xff0c;开发者可以通过提交应用的方式将自己的应用推送到 1Panel 的应用商店中&#xff0c;供其他用户使用。由此衍生了一种本地应用商店的概念&#xff0c;用户可以自行编写应用配置并上传到自…...

Docker Image export and load and tag

# 在国外服务器保存Docker镜像 docker save myimage > myimage.tar # 将tar文件传输到国内服务器 scp myimage.tar root192.0.2.0:/home # 在国内服务器加载Docker镜像 cd /home docker load < myimage.tar # 查看镜像 docker images #docker 镜像名 tag 为none 的解决方…...

七牛使用任务工作流对音频进行转码

最近工作中有对音频转码的需求&#xff0c;比如 iOS 设备中对 ogg 格式的语音支持力度不够&#xff0c;那么可以讲ogg转码成mp3格式,下面来介绍一下&#xff0c;如果通过七牛&#xff0c;后端自行转码&#xff0c;不需要前端做任何事情。 假设我们存在一个音频的 url&#xff…...

Excel提取图片并自动上传到文件服务器(OOS),获取文件链接

Excel提取图片并自动上传到接口 在实际项目中&#xff0c;我们可能经常会遇到需要批量从Excel文件&#xff08;.xlsx&#xff09;中提取图片并上传到特定接口的场景。今天&#xff0c;我就详细介绍一下如何使用Python实现这一功能&#xff0c;本文会手把手教你搭建一个完整的解…...

基于springBoot+vue的PC 端学习系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;线上管理系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;在疫…...

JVM对象创建全过程

JVM对象创建全过程深度解析 1. 对象创建的整体流程 JVM创建对象的过程可以分为7个关键步骤&#xff0c;从类检查到内存分配&#xff0c;再到对象初始化&#xff1a; 类加载检查 → 内存分配 → 内存空间初始化 → 对象头设置 → 构造函数执行 → 栈帧引用建立 → 对象使用2.…...

Spring Boot 核心注解全解:@SpringBootApplication背后的三剑客

大家好呀&#xff01;&#x1f44b; 今天我们要聊一个超级重要的Spring Boot话题 - 那个神奇的主类注解SpringBootApplication&#xff01;很多小伙伴可能每天都在用Spring Boot开发项目&#xff0c;但你真的了解这个注解背后的秘密吗&#xff1f;&#x1f914; 别担心&#x…...