Spring Boot Profiles 环境隔离

Profiles 体系在 Spring Boot 整体结构中的位置、激活机制与 Environment 抽象,见 Spring Boot 主脉络
Profiles 在企业级项目配置分层中的具体实践,见 企业级项目实践指导手册

一、Profiles 是什么

Profiles 是 Spring Boot 提供的环境隔离机制,实现开发、测试、生产环境配置相互隔离,启动时按需激活,无需修改业务代码。
适用场景:
- 开发环境使用本地数据库,生产环境使用云端数据库
- 开发环境开启调试日志,生产环境关闭冗余日志

Profiles 的底层支撑是 Spring Framework 的 Environment 抽象与 @Profile 条件化注册机制,见 Spring Framework 核心体系

二、配置文件命名规范

Spring Boot 自动识别规范命名配置文件,按规则合并加载:

配置文件名称 作用 激活方式
application.yml(主配置) 全局通用配置,所有环境共享 默认自动加载,无需激活
application-{profile}.yml 环境专属配置(dev/test/prod) 需要通过 spring.profiles.active 激活

示例文件:
- 开发环境:application-dev.yml
- 测试环境:application-test.yml
- 生产环境:application-prod.yml

三、三种激活 Profiles 方式

优先级从高到低

1. 命令行激活

最高优先级,生产部署推荐

启动 jar 时传入参数,覆盖配置文件内的激活设置

# 激活单个生产环境
java -jar your-app.jar --spring.profiles.active=prod

# 同时激活多个环境,逗号分隔;后置环境同名配置会覆盖前置
java -jar your-app.jar --spring.profiles.active=prod,metrics

2. 配置文件激活

本地开发调试使用

application.yml内指定默认环境

spring:
  profiles:
    active: dev

3. 代码编程式激活

较少使用,适合动态场景

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class YourAppApplication {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(YourAppApplication.class);
        // 指定激活环境
        app.setAdditionalProfiles("prod");
        app.run(args);
    }
}

四、配置加载优先级规则

优先级自上而下,下方配置可被上方配置同名属性覆盖

配置来源 优先级 示例 特点
命令行参数 最高 --spring.profiles.active=prod--server.port=80 部署灵活,生产环境首选
操作系统环境变量 次高 SPRING_PROFILES_ACTIVE=prod Docker/K8s 容器部署常用
Jar包外部 application-{profile}.yml 中高 外置 application-prod.yml 无需重新打包,可直接修改生产配置
Jar包内部 application-{profile}.yml 内置 application-prod.yml 打包固化,无法外部修改
Jar包外部 application.yml 中低 外置主配置文件 全局通用配置支持外置
Jar包内部 application.yml 最低 内置主配置 项目基础默认配置

五、高级用法:Profile 分组

当需要同时激活多个独立配置环境时,可以定义环境分组,简化启动参数。
application.yml 主配置中定义分组:

spring:
  profiles:
    group:
      production: # 自定义分组名称
        - proddb   # 数据库配置环境
        - prodmq   # 消息队列配置环境

启动只需指定分组名称,自动加载组内所有环境:

java -jar your-app.jar --spring.profiles.active=production

六、@Profile 注解:按环境选择性加载Bean

不仅可以隔离配置文件,还能控制 Bean、配置类是否随环境加载。

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

/**
 * 仅 production 环境生效
 */
@Configuration
@Profile("production")
public class ProductionConfig {

}

/**
 * ! 代表取反,除production外所有环境生效
 */
@Configuration
@Profile("!production")
public class DevTestConfig {

}

七、注意事项

  1. spring.profiles.activespring.profiles.includespring.profiles.group 只能写在主配置 application.yml,禁止写在 application-dev.yml 这类环境专属配置文件;
  2. profile 名称默认存在字符校验;需要特殊字符时关闭校验:
spring:
  profiles:
    validate: false
  1. 多环境同时激活顺序:dev,prod后面环境的同名配置覆盖前面
  2. 主配置 application.yml 所有环境都会加载,环境专属配置是增量覆盖,不是替代。

八、使用建议

  1. 使用流程:创建 application-{profile}.yml → 激活对应环境 → 配置自动合并覆盖;
  2. 标准实践:dev/test/prod 三套环境,本地开发在配置文件激活 dev,生产启动使用命令行指定 prod;
  3. 进阶方案:Profile 分组简化多环境激活,@Profile 实现 Bean 环境隔离。