Spring Boot3 Env 项目地址
https://gitee.com/supervol/loong-springboot-study
(记得给个start,感谢)
Env 概述
在 Spring Boot 3 开发中,多环境配置是核心能力之一,其目的是为不同场景(如开发、测试、生产)提供隔离的配置(如数据库连接、端口、日志级别),避免手动修改配置文件的繁琐与风险。Spring Boot 3 遵循 “约定大于配置” 原则,通过标准化的文件命名、灵活的环境激活方式,实现多环境的无缝切换。
Env 核心
Spring Boot 3 通过配置文件命名规则区分不同环境,核心约定如下:
1. 配置文件类型
支持两种主流格式(推荐yaml
,层级结构更清晰,适合多环境):
properties
:键值对格式,如application.properties
yaml
(YAML):层级缩进格式,如application.yaml
(推荐)
2. 文件命名规则
所有环境的配置文件需放在项目的src/main/resources
目录下,命名遵循:
文件类型 | 主配置文件(全局共享) | 环境专属配置文件(环境隔离) |
---|---|---|
properties |
application.properties |
application-{profile}.properties |
yaml |
application.yaml |
application-{profile}.yaml |
其中,{profile}
是环境标识,需自定义且语义化,常见取值:
dev
:开发环境(本地开发用)test
:测试环境(测试人员用)prod
:生产环境(线上部署用)uat
:预发布环境(上线前验证用)
3. 文件结构示例
src/main/resources/
├─ application.yaml # 主配置(所有环境共享)
├─ application-dev.yaml # 开发环境配置
├─ application-test.yaml # 测试环境配置
└─ application-prod.yaml # 生产环境配置
Env 示例
多环境配置的核心是 “主配置共享 + 环境配置覆盖”—— 主配置定义全局通用属性(如应用名称),环境配置定义该环境专属属性(如端口、数据库),同名属性会被环境配置覆盖。
1. 代码位置
请参考项目地址中 springboot-env/springboot-env-config 模块代码。
2. 激活指定环境
Spring Boot 3 支持多种激活方式,优先级从高到低如下(高优先级覆盖低优先级):
激活方式 | 具体用法 | 适用场景 |
---|---|---|
命令行参数(最高) | 启动 Jar 时指定:java -jar demo-app.jar --spring.profiles.active=prod |
部署时动态指定环境(推荐) |
JVM 参数 | 启动时通过-D 指定:java -Dspring.profiles.active=test -jar demo-app.jar |
测试环境调试 |
系统环境变量 | 配置系统变量:SPRING_PROFILES_ACTIVE=prod (Windows/Linux 通用) |
服务器全局环境配置 |
主配置文件(最低) | 在application.yaml 中配置:spring.profiles.active=dev |
本地开发默认环境 |
Env 进阶
除了基础的 “一环境一文件”,Spring Boot 3 还支持更灵活的配置组织方式,满足复杂场景需求。
1. 激活多个环境
可同时激活多个环境,实现 “基础配置 + 功能配置” 的拆分(如日志配置、数据库配置拆分)。规则:后面激活的环境会覆盖前面的同名属性。拆分日志配置:
- 创建通用日志配置文件:
application-log.yaml
logging: pattern: console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
- 激活
dev
和log
环境(命令行方式):bash
java -jar demo-app.jar --spring.profiles.active=dev,log
此时加载顺序:application.yaml
→application-dev.yaml
→application-log.yaml
,log
的配置会覆盖前两者的同名日志属性。
2. Profile 分组
当环境依赖多个子配置(如prod
依赖 “数据库配置 + 缓存配置 + 日志配置”),可通过Profile 分组简化激活操作。分组生产环境:
在主配置application.yaml
中定义分组:
spring:
profiles:
# 定义prod分组:激活prod时,自动加载prod、prod-db、prod-redis
group:
prod: prod, prod-db, prod-redis
test: test, test-db # 测试环境分组
创建子配置文件:
application-prod-db.yaml
(生产数据库)application-prod-redis.yaml
(生产缓存)
激活分组(只需指定分组名prod
):
java -jar demo-app.jar --spring.profiles.active=prod
3. 外部配置文件
生产环境中,配置文件通常不打包进 Jar,而是放在外部目录(方便修改)。Spring Boot 3 会自动扫描以下外部路径(优先级从高到低):
- 项目根目录下的
config/
文件夹 - 项目根目录
classpath:/config/
(resources/config)classpath:/
(resources,默认)
外部配置生产环境,将application-prod.yaml
放在服务器的/opt/app/config/
目录下,启动 Jar 时指定外部配置路径:
java -jar demo-app.jar --spring.profiles.active=prod --spring.config.location=/opt/app/config/
Env 实践
在分布式系统中,本地多环境配置无法满足 “动态更新配置”“统一管理配置” 的需求,通常会结合配置中心(如 Nacos、Spring Cloud Config)使用:
- 配置中心存储:将
dev
/test
/prod
环境的配置存储到配置中心,按环境分组。 - 应用动态拉取:Spring Boot 应用启动时,通过配置中心的地址和环境标识(如
spring.cloud.nacos.config.profile=prod
),动态拉取对应环境的配置。 - 配置动态更新:配置中心修改配置后,应用无需重启即可实时感知更新(需开启配置刷新机制)。
Env 注意
- 配置覆盖优先级:命令行参数 > 系统环境变量 > JVM 参数 > 外部配置文件 > 内部配置文件。
- 避免硬编码敏感信息:生产环境的密码、密钥等,不要写在配置文件中,应通过环境变量(如
${DB_PASSWORD}
)或配置中心加密存储获取。 - YAML 格式缩进问题:YAML 依赖缩进(2 个空格,不支持 Tab),缩进错误会导致配置加载失败,需注意格式校验。
- 多环境激活顺序:同时激活多个环境时(如
dev,log
),后面的环境会覆盖前面的同名属性,需合理安排顺序。