Spring Boot中环境变量优先级为第4位,可直接覆盖内置配置;需按全大写+下划线转小写+点分隔规则命名(如SERVER_PORT→server.port),并在JVM启动前设置,配合profile使用更灵活。

Spring Boot 通过外部化配置的优先级机制,让环境变量能自然、可靠地覆盖应用内默认配置,无需额外编码或干预。关键在于环境变量处于整个加载链中靠前的位置——它不是“可选补充”,而是被设计为生产环境部署时的标准覆盖手段。
环境变量在优先级中的位置很靠前
在 Spring Boot 官方定义的 Externalized Configuration 顺序中,操作系统环境变量排在第 4 位(从高到低):
- 命令行参数(最高)
- JNDI 属性
- Java 系统属性(
System.getProperties()) - 操作系统环境变量(当前讨论的核心)
- 随机值(
random.*) - 外部 profile 配置文件(如
./config/application-prod.yml) - 内部 profile 配置文件(如
classpath:/application-prod.yml) - 外部默认配置(如
./config/application.yml) - 内部默认配置(如
classpath:/application.yml)
这意味着:只要环境变量设置了某个 key(比如 SERVER_PORT=8081),它就会直接覆盖 jar 包内 application.yml 或 application.properties 中同名的值,且无需重启应用或改代码。
环境变量命名需匹配 Spring Boot 的解析规则
Spring Boot 不是直接读取原始环境变量名,而是按固定规则映射成配置 key:
立即学习“Java免费学习笔记(深入)”;
- 全大写 + 下划线 → 转为小写 + 驼峰或点分隔形式
-
SERVER_PORT→server.port -
SPRING_DATASOURCE_URL→spring.datasource.url -
MYAPP_FEATURE_ENABLED→myapp.feature.enabled
注意:SPRING_ 前缀会被自动识别为 Spring Boot 内部属性前缀;自定义属性建议统一用项目名前缀(如 MYAPP_),避免与框架冲突。
实际部署中如何确保生效
环境变量必须在 JVM 启动前由操作系统设置,且对 Java 进程可见:
- Linux/macOS:启动前执行
export SERVER_PORT=9000,再运行java -jar app.jar - Docker:使用
-e SERVER_PORT=9000或environment:在 docker-compose.yml 中声明 - Kubernetes:通过
env:字段注入到容器环境 - Windows CMD:用
set SERVER_PORT=9000 && java -jar app.jar
验证是否生效?启动日志里会打印类似 The following 1 profile is active: default,同时可通过 Actuator 的 /actuator/env 端点查看所有已加载的 PropertySource,其中 systemEnvironment 会明确列出你设置的变量及其最终解析结果。
环境变量和 profile 配合使用效果更好
单独用环境变量适合简单覆盖(如端口、数据库地址),但复杂场景建议结合 profile:
- 先设
SPRING_PROFILES_ACTIVE=prod激活生产 profile - 再设
PROD_DB_URL=jdbc:mysql://...,并在application-prod.yml中引用${prod.db.url} - 或者直接用
SPRING_DATASOURCE_URL覆盖整个数据源配置,跳过 yml 文件
这样既保持配置结构清晰,又保留了环境变量的灵活覆盖能力。


















