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

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.lryc.cn/news/615495.html

相关文章:

  • 机器学习第七课之支持向量机SVM
  • Java Callback 实现线程切换以及与Kotlin原理关系
  • 数码管的使用(STC8)
  • Pytest中实现自动生成测试用例脚本代码
  • Java Stream 使用 Fork/Join框架的分治任务模型
  • Windows 安装 Xinference 速记
  • CPU缓存(CPU Cache)和TLB(Translation Lookaside Buffer)缓存现代计算机体系结构中用于提高性能的关键技术
  • 【线性代数】线性方程组与矩阵——(2)矩阵与线性方程组的解
  • 计算机网络:深入了解CIDR地址块如何利用VLSM进行子网划分的过程
  • 前端视角下关于 WebSocket 的简单理解
  • 如何在 Ubuntu 24.04 LTS Linux 上安装 Azure Data Studio
  • 【排序算法】④堆排序
  • 基于STM32H5的非循环GPDMA链表使用
  • LangChain-Unstructured 基础使用:PDF 与 Markdown 处理解析
  • 基于IPD体系的研发项目范围管理
  • 【网络与爬虫 52】Scrapyd-k8s集群化爬虫部署:Kubernetes原生分布式爬虫管理平台实战指南
  • 一个app项目周期是多久?
  • Java异常:认识异常、异常的作用、自定义异常
  • 世界时(Universal Time, UT)的定义与详解
  • 小学数学训练闭环:出题、作答、批改一体化方案实践
  • [Oracle] MAX()和MIN()函数
  • 【Python 高频 API 速学 ④】
  • LintCode第547题-两数组的交集
  • 腾讯COS云存储入门
  • 浅尝AI辅助C转Verilog方法
  • 新手小白使用jQuery在实际开发中常用到的经验
  • 第二十天:余数相同问题
  • 《Resolving tissue complexity by multimodal spatial omics modeling with MISO》
  • 【面试场景题】微博热点新闻系统设计方案
  • day18 - CSS函数