一、为什么会有优先级问题?

在实际开发中,同一个配置可能会出现在多个地方:

server.port=8080

它可能出现在:

  • 命令行
  • JVM 参数
  • Docker environment
  • application.yml
  • 默认值

那问题来了:

Spring 最终到底用哪个?优先级是怎么样的?


二、Spring Boot 配置优先级总览(高 → 低)

下面是工程实践中最重要、最常见的优先级顺序:

1️⃣ 命令行参数(--xxx=yyy)
2️⃣ JVM 系统属性(-Dxxx=yyy)
3️⃣ 操作系统环境变量
4️⃣ 外部 application.yml(jar 同级目录)
5️⃣ 内部 application.yml(classpath 下)
6️⃣ @PropertySource
7️⃣ 默认值 ${xxx:default}

离“启动命令”越近,谁优先级越高。


三、逐层详细解析

① 命令行参数(最高)

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

特点:

  • 最高优先级
  • 专门为 Spring Boot 设计
  • 适合部署时动态覆盖

使用场景:

  • 线上临时改端口
  • 指定 profile
--spring.profiles.active=prod

② JVM 系统属性(-D)

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

或者在 IntelliJ IDEA VM Options 里写:

-Dspring.profiles.active=dev

特点:

  • 优先级仅次于 – 参数
  • 本质是 System.getProperty()

适合:

  • 本地开发
  • IDE 调试

③ 操作系统环境变量

Linux / Mac:

export SERVER_PORT=9090

Docker:

environment:
  SERVER_PORT: 9090

特点:

  • 常用于容器化部署
  • 优先级低于 -D

Spring 会自动把:

SERVER_PORT

映射为:

server.port

④ 外部 application.yml

例如:

/app.jar
/application.yml

如果 jar 同级目录有配置文件:

👉 优先级高于 jar 内部配置

这是生产环境最常用方式。


⑤ 内部 application.yml(classpath)

src/main/resources/application.yml

这是最常见的默认配置来源。

优先级低于:

  • 命令行
  • -D
  • 环境变量
  • 外部配置文件

⑥ @PropertySource

@PropertySource("classpath:xxx.properties")

特点:

  • 通常用于传统 Spring 项目
  • 优先级低于 application.yml
  • 在 Boot 项目中不常作为主配置

⑦ 默认值(最低)

jdbc.url=${MYSQL_HOST:localhost}

意思:

如果前面所有来源都没有 MYSQL_HOST
就使用:

localhost

它永远是最后兜底。


四、特殊说明:RandomValuePropertySource

my.secret=${random.uuid}

这是 Spring Boot 内置的:

RandomValuePropertySource

不是配置的来源,而是框架自动注册。

它用于:

  • 生成随机值
  • 测试场景
  • 动态端口

五、优先级对比实战示例

假设:

application.yml:

server:
  port: 8080

Docker:

environment:
  SERVER_PORT: 9090

IDEA VM Options:

-Dserver.port=7070

启动命令:

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

最终端口是多少?

答案:

6060

因为:

--参数 > -D > 环境变量 > yml

六、Spring Boot 配置加载核心原理

启动时:

  1. 创建 Environment
  2. 构建多个 PropertySource
  3. 按顺序插入
  4. 查找时从上往下找
  5. 找到即停止

本质是:

一个有序的 PropertySource 链表

七、适用于什么项目?

以上规则适用于:

  • 基于 Spring Boot 的项目

如果是传统:

  • XML + web.xml
  • 非 Boot 项目

优先级规则会不同。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐