
本文详解 Spring Boot 应用中 dev 与 prod 环境的标准化配置方案,涵盖 profile 激活机制、配置文件分层设计、.env 文件的适用边界,以及敏感信息安全管理,助你规避常见配置陷阱。
本文详解 spring boot 应用中 dev 与 prod 环境的标准化配置方案,涵盖 profile 激活机制、配置文件分层设计、`.env` 文件的适用边界,以及敏感信息安全管理,助你规避常见配置陷阱。
在 Spring Boot 中实现开发(dev)与生产(prod)环境的可靠隔离,关键不在于“如何设置”,而在于“在哪里设置、由谁控制、何时生效”。盲目将 spring.profiles.active=prod 写死在 application.yml 中,不仅违背配置即代码(Configuration-as-Code)原则,更会导致配置污染、版本冲突与部署风险。以下是经过生产验证的推荐实践。
✅ 推荐架构:三层配置 + 外部激活
采用 “基础配置 + 环境特化 + 外部驱动” 模式,共需三个核心配置文件:
| 文件名 | 作用 | 示例内容 |
|---|---|---|
| application.yml | 全环境共享配置(profile-agnostic) | server.servlet.context-path: /api, logging.level.root: INFO |
| application-dev.yml | 开发环境专属配置(覆盖/补充) | server.port: 8080, spring.h2.console.enabled: true, spring.datasource.url: jdbc:h2:mem:devdb |
| application-prod.yml | 生产环境专属配置 | server.port: 8081, spring.datasource.url: jdbc:postgresql://db:5432/myapp, management.endpoints.web.exposure.include: health,metrics,prometheus |
⚠️ 注意:application.yml 中不应包含任何 spring.profiles.active 设置——它必须保持中立,仅承载通用配置。
? 如何激活指定环境?——统一通过外部参数控制
启动时通过命令行参数、IDE 运行配置或容器环境变量显式指定 profile,确保环境决策权脱离代码库,交由部署上下文决定:
# 方式1:命令行启动(推荐) java -jar myapp.jar --spring.profiles.active=dev # 方式2:Maven 运行(开发调试) mvn spring-boot:run -Dspring-boot.run.profiles=prod # 方式3:IntelliJ 配置(Run Configuration → Program arguments) --spring.profiles.active=dev # 方式4:Docker 启动(环境变量等效) docker run -e "SPRING_PROFILES_ACTIVE=prod" myapp:latest
Spring Boot 会自动合并加载:先读 application.yml,再按 active 列表顺序叠加 application-{profile}.yml(后加载者优先级更高),实现安全覆盖。例如:
# application.yml server.port: 8080 spring.datasource.url: jdbc:h2:mem:default # application-dev.yml spring.datasource.url: jdbc:h2:mem:devdb
→ 最终生效 server.port=8080(继承),spring.datasource.url=jdbc:h2:mem:devdb(覆盖)。
❌ 关于 .env 文件:谨慎使用,非 Spring Boot 原生方案
.env(如 .env-dev)是第三方工具(如 Docker Compose、dotenv 库)约定的环境变量文件,Spring Boot 默认完全忽略它。IntelliJ 也不会自动加载 .env ——除非你手动配置了「Environment variables」字段或集成了 dotenv 插件。
✅ 正确做法:
- 若需 OS 级环境变量(如 JAVA_HOME, HADOOP_HOME),直接在系统/Shell/CI 环境中导出;
- 若需传递给 Spring Boot(如 SPRING_PROFILES_ACTIVE),应通过 -D JVM 参数或 -- 命令行参数,而非依赖 .env;
- 若团队已用 dotenv 管理密钥,建议仅用于本地开发辅助,且必须在 gitignore 中排除所有 .env* 文件,杜绝泄露。
? 敏感配置:永远不要写入 YAML!
数据库密码、API 密钥、JWT 秘钥等绝不可出现在 application-dev.yml 或 application-prod.yml 中。推荐方案:
- 开发阶段:使用 Spring Boot Config Server + Git Backend(加密分支)或本地 JCEKS 密钥库;
- 生产阶段:集成 HashiCorp Vault、AWS Secrets Manager 或 Azure Key Vault。Spring Cloud Vault 可无缝注入:
# application-prod.yml(仅存引用)
spring:
cloud:
vault:
host: vault.example.com
port: 8200
authentication: TOKEN
datasource:
username: ${vault.username}
password: ${vault.password}启动时通过 VAULT_TOKEN 环境变量认证,由 Spring Cloud Vault 自动解析占位符。
✅ 总结:四条黄金准则
- 配置分离:application.yml(通用)+ application-{profile}.yml(差异化);
- 激活外置:永远通过 --spring.profiles.active=xxx 启动参数控制,禁止硬编码;
- 环境变量慎用:.env 不是 Spring Boot 标准,OS 级变量应通过标准方式(-D, SPRING_PROFILES_ACTIVE)桥接;
- 密钥零落地:敏感数据交由专业密钥管理服务,配置文件只存逻辑引用。
遵循此模式,你的 Spring Boot 应用将具备清晰的环境边界、可审计的配置变更、安全的密钥流转,真正实现“一次构建,多环境部署”。










