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

SpringBoot配置生效优先级

题目详细答案

SpringBoot外部配置文件的加载顺序,从高到低大致如下

命令行参数:

通过命令行传入的参数具有最高的优先级,可以覆盖其他配置文件中相同的配置项。例如,使用java -jar myapp.jar --server.port=8080来设置服务端口。

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

可以通过System.setProperty方法设置,或者在启动JVM时通过-D参数指定,例如-Duser.name=admin

操作系统环境变量:

系统环境变量中的配置,优先级低于Java系统属性。

配置文件(jar包外部):

包括application-{profile}.propertiesapplication-{profile}.yml(带有profile的)和application.propertiesapplication.yml(不带profile的),同目录下带profile的配置文件优先级别高于不带profile的。

jar包外的配置文件可以直接放在当前jar包所在目录/config/下(推荐),也可以直接放在当前jar包所在目录/下

配置文件(jar包内部):

与jar包外部的配置文件类似,但优先级更低,打包后不可变

通过@Configuration注解类上的@PropertySource指定的配置文件:

这些配置文件的优先级低于上述所有外部配置方式。

通过SpringApplication.setDefaultProperties指定的默认属性:

这是Spring Boot提供的另一种设置默认属性的方式,优先级最低。

Spring Boot 配置生效优先级详解

Spring Boot 的配置系统采用了一种精心设计的多层优先级机制,确保开发者可以灵活地管理各种来源的配置。以下是完整的配置优先级体系(从最高到最低):

一、配置源优先级总览

  1. 命令行参数 (最高优先级)
  2. Java 系统属性 (-D参数)
  3. 操作系统环境变量
  4. JNDI 属性
  5. ServletContext 初始化参数
  6. ServletConfig 初始化参数
  7. 外部配置文件
  8. 内部配置文件
  9. @PropertySource 注解配置
  10. 默认属性 (最低优先级)

二、详细配置源解析

1. 命令行参数 (最高)

java -jar app.jar --server.port=8081 --spring.datasource.url=jdbc:mysql://localhost:3306/mydb
  • 特点:即时生效,部署时动态指定
  • 安全提示:敏感信息应避免直接写在命令行

2. Java 系统属性

java -Dspring.profiles.active=prod -Dapp.timeout=5000 -jar app.jar

3. 操作系统环境变量

# Linux/MacOS
export SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/mydb# Windows
set SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/mydb
  • 自动映射SPRING_DATASOURCE_URLspring.datasource.url
  • 云原生最佳实践:Kubernetes 中推荐使用环境变量

4. 外部配置文件加载顺序

1. 当前项目所在目录下的config/application-{profile}.yml
2. 当前项目所在目录下的config/application.yml
3. 当前项目所在目录下的application-{profile}.yml
4. 当前项目所在目录下的application.yml
  • 路径解析:相对于运行目录,非项目目录
  • 生产建议:将配置放在 jar 包外部的 /config 目录

5. 内部配置文件加载顺序

1. classpath:/config/application-{profile}.yml
2. classpath:/config/application.yml
3. classpath:/application-{profile}.yml
4. classpath:/application.yml
  • 打包后不可变:适合默认配置

6. Profile 处理规则

  • 激活方式
--spring.profiles.active=prod,metrics
  • 覆盖顺序:右侧 Profile 覆盖左侧配置
  • 特殊语法
spring:profiles:include: db,mq

三、配置合并与覆盖规则

1. 属性覆盖行为

场景

结果

命令行 vs 文件配置

命令行优先

系统属性 vs 环境变量

系统属性优先

外部 vs 内部配置

外部优先

同目录 properties vs yml

properties 优先

2. 特殊类型属性处理

  • 列表/数组:追加而非覆盖
# application.yml
spring:profiles:include: base# application-prod.yml
spring:profiles:include: metrics# 结果:base,metrics
  • Map 类型:深度合并(递归合并嵌套属性)

四、最佳实践指南

1. 多环境配置方案

config/
├─ application.yml            # 基础配置
├─ application-dev.yml        # 开发环境
├─ application-staging.yml    # 预发环境
└─ application-prod.yml       # 生产环境

2. 安全配置建议

  • 敏感信息
spring:datasource:password: ${DB_PASSWORD:}
  • 加密方案
spring:datasource:password: ENC(密文)

3. 调试与验证

# 查看所有生效配置
curl http://localhost:8080/actuator/env# 查看特定属性来源
curl http://localhost:8080/actuator/env/server.port# 启用配置加载日志
logging.level.org.springframework.boot.context.config=DEBUG

五、特殊场景说明

1. Spring Cloud 配置

  • bootstrap.yml:优先于所有 application 配置加载
  • 配置中心:优先级介于命令行参数和系统属性之间

2. 测试环境配置

@SpringBootTest
@ActiveProfiles("test")
public class MyTests {// 测试代码
}

理解这些优先级规则可以帮助您:

  1. 正确管理不同环境的配置
  2. 安全地处理敏感信息
  3. 快速定位配置冲突
  4. 构建灵活的部署方案

Spring Boot 的这种分层配置机制是其"约定优于配置"理念的核心体现,为应用提供了极大的灵活性和可维护性。

http://www.xdnf.cn/news/17549.html

相关文章:

  • CPU缓存(CPU Cache)和TLB(Translation Lookaside Buffer)缓存现代计算机体系结构中用于提高性能的关键技术
  • Irix HDR Pro:专业级 HDR 图像处理软件
  • ubuntu 端口占用 但是找不到进程 与docker 容器镜像相关
  • rem:CSS中的相对长度单位
  • B.10.01.3-性能优化实战:从JVM到数据库的全链路优化
  • 莫比乌斯反演学习笔记
  • .htaccess 文件上传漏洞绕过总结
  • Delphi:TList/TObjectList 设计中的 Notify 设计范式
  • 供应链需求预测项目如何设定合理的KPI、准确率指标(十四)
  • Spring Boot 集成 Quartz 实现定时任务(Cron 表达式示例)
  • Spark02 - SparkContext介绍
  • 【多模态目标检测数据集】【VEDAI】航空影像中的车辆检测:小目标检测基准
  • 2025年渗透测试面试题总结-10(题目+回答)
  • C语言:构造类型
  • C++学习之STL学习:map/set
  • 【面试题】cookie和session 的区别
  • 使用GTX ip core + SDI IP core实现SDI设计
  • BeanDefinition 与 Bean 生命周期(面试高频考点)
  • 《Learning To Count Everything》论文阅读
  • 鸿蒙开发中的Tabs组件详解
  • 使用 Visual Studio 2022 编译 PortAudio 项目
  • docker基础前置
  • Microsoft Office Visio(流程图)学习笔记
  • 【华为仓颉编程语言】标识符
  • 栈和队列应用实操
  • LabVIEW核物理虚拟仪器教学
  • 【26】C#实战篇—— 多个线程函数对同一个 Excel 文件进行写操作引起的文件冲突问题,解决方法
  • Playwright C# 自动登录并上传 Excel 文件 的可运行示例
  • 十九、MySQL-DQL-基本查询
  • Python day39