环境变量覆盖默认配置是云原生部署中最常用、最可靠的方式,符合十二要素原则,优先级高于application.yml但低于命令行参数和jvm属性,支持嵌套属性与占位符回退,并可通过k8s的configmap/secret安全注入。

环境变量覆盖默认配置是云原生部署中最常用、最可靠的方式之一,它天然符合十二要素应用原则(配置与代码分离),且无需修改镜像或重启应用即可生效。
环境变量优先级高于 application.yml
Spring Boot 默认支持环境变量自动映射为配置属性,规则是:将环境变量名转为小写,用下划线分隔的单词(如 DB_URL)自动对应配置项 db.url。该机制在 Spring Environment 初始化早期即生效,其优先级高于 classpath 下的 application.yml 和 application.properties,但低于命令行参数(--key=value)和 JVM 系统属性(-Dkey=value)。
- 例如,在 application.yml 中定义:
spring.datasource.url: jdbc:h2:mem:testdb - 若容器启动时设置环境变量:
SPRING_DATASOURCE_URL=jdbc:mysql://prod-db:3306/app - 则最终生效的 URL 就是 MySQL 地址——无需改代码、不需重新打包
支持嵌套属性与占位符回退
环境变量不仅能完全替换简单属性,还能配合占位符实现“有则用、无则退”的柔性策略:
- 写法示例:
spring.profiles.active=${SPRING_PROFILES_ACTIVE:dev}
表示:若环境变量 SPRING_PROFILES_ACTIVE 存在,则取其值;否则使用默认值 dev - 嵌套结构也适用:
app.service.timeout=${APP_SERVICE_TIMEOUT:5000}
可被 APP_SERVICE_TIMEOUT=10000 覆盖 - 注意:环境变量名必须全大写 + 下划线,Spring Boot 自动完成大小写与分隔符转换
Kubernetes 场景下的典型落地方式
在 K8s 中,环境变量通常通过 ConfigMap 或 Secret 注入,兼顾可维护性与安全性:
- 用 ConfigMap 定义非敏感配置:
kubectl create configmap app-config --from-literal=SPRING_DATASOURCE_USERNAME=admin - 在 Deployment 中引用:
envFrom:
- configMapRef:
name: app-config - 敏感信息(如密码)应走 Secret:
kubectl create secret generic db-secret --from-literal=SPRING_DATASOURCE_PASSWORD=xxx
再通过 envFrom.secretRef 注入 - 也可直接在容器 env 列表中硬编码(仅限调试):
- name: APP_LOG_LEVEL
value: "debug"
验证与调试技巧
运行时确认环境变量是否生效,避免“设了却没用”:
- 进入 Pod 执行:
env | grep -i datasource —— 查看原始环境变量 - 访问 Actuator 的 /actuator/env 端点(需开启):
返回 JSON 中会明确列出每个 PropertySource 及其来源(如 systemEnvironment 优先级高于 configurationProperties) - 日志启动时会打印类似:
The following profiles are active: prod
说明 SPRING_PROFILES_ACTIVE 已被识别并激活
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











