Spring Boot 通过 ${ENV_VAR} 直接引用系统环境变量,底层基于 System.getenv() 自动集成;需全大写+下划线命名,支持默认值如 ${MY_API_KEY:default-key},启动前设置才生效。

System.getenv() 是 Java 原生获取操作系统环境变量的方法,而 Spring Boot 的 ${ENV_VAR} 占位符底层正是基于 System.getenv()(以及 System.getProperty()、PropertySource 等)来解析的——所以你不需要手动调用 System.getenv(),Spring Boot 已自动集成。
application.yml 中直接使用 ${ENV_VAR} 就行
Spring Boot 启动时会自动将系统环境变量注册为 PropertySource,优先级高于 application.yml 本身。只要环境变量存在,就能在配置文件中用 ${VAR_NAME} 引用:
- Linux/macOS 启动前设置:
export MY_API_KEY=abc123 - Windows CMD:
set MY_API_KEY=abc123 - 然后在
application.yml中写:
api.key: ${MY_API_KEY}
支持默认值和嵌套表达式
避免因环境变量未设置导致启动失败,推荐加默认值:
-
api.key: ${MY_API_KEY:default-key} —— 变量不存在时用
default-key - db.url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/mydb
- 注意:冒号前后不能有空格,否则解析失败
区分大小写与命名规范
环境变量名在 Linux/macOS 中默认**全大写+下划线**,且对大小写敏感:
立即学习“Java免费学习笔记(深入)”;
-
export DB_URL=jdbc:h2:mem:test→${DB_URL}✅ -
export db_url=...→${db_url}❌(多数系统不识别小写环境变量) - Spring Boot 会自动把
spring.datasource.url这类属性映射为SPRING_DATASOURCE_URL,但自定义变量建议统一用大写
验证是否生效的小技巧
启动后检查实际加载的配置:
- 访问
http://localhost:8080/actuator/env(需启用 actuator),搜索变量名 - 或在代码中打印:
System.out.println(System.getenv("MY_API_KEY"));和@Value("${api.key}") String key对比 - 如果
${MY_API_KEY}解析为空,先确认环境变量是否在 JVM 启动前设置(不是 IDE 运行配置里临时加的)


















