spring boot 默认自动读取操作系统环境变量和 java 系统属性并覆盖同名配置项;环境变量需大写、点号转下划线(如 server_port→server.port),连字符转点号后再转下划线(如 server-addr→server_addr),且必须在 jvm 启动前设置。

Spring Boot 默认会自动读取操作系统环境变量和 Java 系统属性,并用它们覆盖配置文件中的同名属性——这是它实现「外部化配置」的核心机制,无需额外编码即可生效。
环境变量怎么命名才有效
Spring Boot 会把环境变量名自动转为小写、用点号(.)替换下划线(_),再与配置项匹配。例如:
-
SERVER_PORT=8081→ 覆盖server.port -
SPRING_PROFILES_ACTIVE=prod→ 覆盖spring.profiles.active -
DATASOURCE_URL=jdbc:mysql://prod-db:3306/app→ 覆盖datasource.url -
SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=192.168.1.100:8848→ 覆盖spring.cloud.nacos.config.server-addr(注意连字符转点号)
Windows 和 Linux 下设置方式一致,只需确保变量在 JVM 启动前已存在。
系统属性(-D 参数)的优先级更高
启动时通过 -Dkey=value 设置的系统属性,优先级高于环境变量。常见用法:
java -Dserver.port=9000 -jar app.jarjava -Dspring.profiles.active=test -Dlogging.level.root=DEBUG -jar app.jar
这些参数会直接注入 JVM 的 System.getProperties(),Spring Boot 在加载配置时自动识别并应用。
怎么验证哪个值最终生效
启动日志中搜索 Bound 或 Using default 可看到实际绑定的配置;更可靠的方式是注入 Environment 主动检查:
@Autowired
private Environment env;
// 获取 server.port 实际值(含所有来源的最终结果)
String port = env.getProperty("server.port");
也可访问 /actuator/env(需启用 actuator)查看全部配置源及值来源。
注意覆盖逻辑和常见陷阱
覆盖只发生在相同 key 上,且遵循严格优先级:命令行参数 > 环境变量 > 配置文件 > 代码默认值。但要注意:
- 环境变量必须在应用启动前设置(IDE 中需在 Run Configuration 的 Environment Variables 栏添加)
- YAML 中的嵌套结构(如
app.feature.enabled)对应环境变量应写作APP_FEATURE_ENABLED=true - 若配置项带连字符(如
spring.cloud.nacos.config.server-addr),环境变量名需用下划线替代(SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR),不能用连字符 - 敏感字段(密码、密钥)建议只通过环境变量或系统属性注入,避免硬编码在配置文件中











