SpringBoot中Profile 多环境配置(dev/test/prod)详解

SpringBoot中Profile 多环境配置(dev/test/prod)详解


🎯 一、核心概念

  • Profile:Spring 中用于区分不同环境的标识。
  • Spring Boot 会根据激活的 Profile 自动加载对应的配置文件(如 application-dev.yml)。
  • 默认配置在 application.yml 或 application.properties 中,会被特定 Profile 配置覆盖。

📁 二、配置文件命名规范

Spring Boot 支持以下格式:

复制代码
application-{profile}.yml
application-{profile}.properties

常见命名示例:

  • application-dev.yml → 开发环境
  • application-test.yml → 测试环境
  • application-prod.yml → 生产环境

✅ 同时支持 .yml 和 .properties,但建议统一使用一种(推荐 YAML,更简洁)。


⚙️ 三、如何激活某个 Profile?

有多种方式指定当前使用哪个环境配置:

1. 在 application.yml 中默认激活

复制代码
# application.yml
spring:
  profiles:
    active: dev  # 默认激活 dev 环境

2. 通过启动参数(推荐部署时使用)

复制代码
java -jar myapp.jar --spring.profiles.active=prod

3. 通过 JVM 系统属性

复制代码
java -Dspring.profiles.active=prod -jar myapp.jar

4. 环境变量(Linux / Docker 中常用)

复制代码
export SPRING_PROFILES_ACTIVE=prod
java -jar myapp.jar

💡 优先级:命令行参数 > 系统属性 > 环境变量 > 配置文件中的默认值


🧩 四、配置示例

主配置文件:application.yml

复制代码
# 公共配置(所有环境共享)
app:
  name: MySpringBootApp
  version: 1.0.0

# 默认激活 dev
spring:
  profiles:
    active: dev

开发环境:application-dev.yml

复制代码
server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb_dev
    username: root
    password: 123456
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update

logging:
  level:
    com.example: debug

测试环境:application-test.yml

复制代码
server:
  port: 8081

spring:
  datasource:
    url: jdbc:mysql://test-db:3306/mydb_test
    username: testuser
    password: testpass
  jpa:
    show-sql: false
    hibernate:
      ddl-auto: validate

logging:
  level:
    com.example: info

生产环境:application-prod.yml

复制代码
server:
  port: 80

spring:
  datasource:
    url: jdbc:mysql://prod-db-cluster:3306/mydb_prod
    username: ${DB_USER}        # 推荐从环境变量读取敏感信息
    password: ${DB_PASSWORD}
  jpa:
    show-sql: false
    hibernate:
      ddl-auto: none  # 禁止自动建表!

logging:
  level:
    com.example: warn
  file:
    name: /var/log/myapp.log

🔒 安全提示 :生产环境的密码、密钥等敏感信息不要硬编码,应通过环境变量、配置中心(如 Nacos、Apollo)或 Kubernetes Secret 注入。


🧪 五、在代码中判断当前 Profile(可选)

有时需要在 Java 代码中根据环境执行不同逻辑:

复制代码
@Autowired
private Environment env;

public void doSomething() {
    if (env.acceptsProfiles("prod")) {
        // 生产环境特殊处理
    }
}

或者使用注解:

复制代码
@Profile("dev")
@Component
public class DevDataSourceConfig {
    // 仅在 dev 环境生效
}

🐳 六、Docker / 云原生场景建议

  • 构建镜像时不包含具体环境配置 ,只打包 application.yml(无敏感信息)。
  • 启动容器时通过 -e SPRING_PROFILES_ACTIVE=prod 指定环境。
  • 敏感配置通过 -e DB_PASSWORD=xxx 或挂载 configmap/secret 注入。

示例 Docker 启动命令:

复制代码
docker run -d \
  -e SPRING_PROFILES_ACTIVE=prod \
  -e DB_USER=myuser \
  -e DB_PASSWORD=mypass \
  -p 80:80 \
  my-springboot-app:latest

✅ 七、最佳实践总结

建议 说明
✅ 使用 application-{env}.yml 分离配置 清晰、易维护
✅ 敏感信息不写死 用环境变量或配置中心
✅ 生产环境关闭 ddl-auto 和 show-sql 避免意外修改数据库
✅ 日志路径和级别按环境区分 方便排查问题
✅ CI/CD 中动态传入 profile 如 Jenkins/GitLab CI 中指定 --spring.profiles.active=test

相关推荐
梦想恒远8 小时前
Spring Boot + LangChain4j 统计 token 成本:ChatModelListener 实测与单价口径
spring boot·后端
howard200516 小时前
Spring Boot 版新生报到可视化系统
spring boot·新生报到可视化系统
她的男孩18 小时前
子表只读列界面能改,保存却报不允许编辑:Forge Admin 把字段权限落到子表列
spring boot·低代码·工作流引擎
杨凯凡18 小时前
MySQL 死锁怎么排查?InnoDB 锁等待与 Spring Boot 整事务重试实战
数据库·spring boot·mysql
RuoyiOffice1 天前
SpringBoot+Vue3 凭证生命周期设计:审核、过账、冲销与反过账怎样保持账目一致
java·spring boot·事务·springboot3·财务系统·会计凭证·ruoyi office
RuoyiOffice1 天前
KubeSphere 容器云实践:从管理 K8s 到建设企业 PaaS,还需要哪些能力
spring boot·kubernetes·kubesphere·jenkins·paas·微服务部署·ruoyi office
软件技术NINI2 天前
基于SpringBoot和Vue的新能源汽车销售推荐系统
java·vue.js·spring boot·后端·汽车·毕业设计·毕设
Flynn Liang2 天前
LangChain4j 生产级工程骨架:12 个模块 + Docker 一键启动
java·spring boot·langchain·rag·langchain4j
RuoyiOffice2 天前
固定资产维修管理:从报修、审批到办结,原资产卡怎么回查?
spring boot·固定资产·ruoyi office·资产维修·维修审批·维修办结·资产履历
招风的黑耳2 天前
SpringBoot+Vue+MySQL 民宿在线预定平台 完整可运行版(源码+文档)
vue.js·spring boot·mysql