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 |