首页 / Spring Boot 入门教程 / Profile 多环境配置

Spring Boot 入门教程

Profile 多环境配置

本教程共 48 篇 · 第 13 篇 · 更新于 2026-08-13 · 约 4 分钟阅读

Profile多环境spring.profiles.active@Profileapplication-prodprofile分组

本节目标:用 Profile 把开发、测试、生产配置分开管理,掌握文件命名、激活方式和 @Profile 注解。

为什么需要 Profile

同一个应用,开发连本地数据库,生产连线上数据库。

把两套配置写进一个文件,互相覆盖,乱成一团。

Profile 就是干这个的:给配置打标签,按需启用。

激活某个 Profile,对应的配置才生效。其余环境的配置不加载。

配置文件按环境拆分

命名规则:application-{profile}.yml

比如 application-dev.ymlapplication-prod.yml,加上公共的 application.yml

# application.yml —— 所有环境共用
spring:
  application:
    name: hello-app

server:
  port: 8080
# application-dev.yml —— 开发环境
server:
  port: 8081

app:
  message: 这是开发环境
# application-prod.yml —— 生产环境
server:
  port: 443

app:
  message: 这是生产环境

规则很简单:profile 文件覆盖公共文件里的同名属性。

application.yml 里的 port 是 8080,激活 dev 后变 8081,激活 prod 后变 443。

Note

激活多个 profile 时,后面的赢。比如激活 prod,live 两个,application-live.yml 覆盖 application-prod.yml

怎么激活 Profile

方式一:写死在公共配置文件里

spring:
  profiles:
    active: dev

适合开发环境,但生产千万别这么干——代码里写死环境就失去意义了。

方式二:命令行参数(最常用)

java -jar hello-app.jar --spring.profiles.active=prod

Maven 开发时:

mvn spring-boot:run -Dspring-boot.run.arguments="--spring.profiles.active=dev"

方式三:环境变量

SPRING_PROFILES_ACTIVE=prod java -jar hello-app.jar

环境变量优先级高于配置文件,命令行参数又高于环境变量。容器平台传环境变量最顺手。

Warning

spring.profiles.active 只能写在非 profile 专属的文档里。写在 application-dev.yml 里不生效,Spring Boot 直接忽略。

不激活时用默认 Profile

没激活任何 profile 时,默认 profile 生效,名字叫 default

也就是说 application-default.yml 会被加载。想改默认名:

spring:
  profiles:
    default: local

启动日志里能看到提示:

No active profile set, falling back to 1 default profile: "default"

@Profile 控制 Bean 加载

配置文件管属性,@Profile 管 Bean。

同一个接口,不同环境用不同实现:

// WeatherService.java
public interface WeatherService {
    String forecast();
}
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;

@Service
@Profile("sunny")
public class SunnyDayService implements WeatherService {

    @Override
    public String forecast() {
        return "Today is sunny day!";
    }
}
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;

@Service
@Profile("raining")
public class RainingDayService implements WeatherService {

    @Override
    public String forecast() {
        return "Today is raining day!";
    }
}

激活 raining 时只有 RainingDayService 存在,注入的就是它。

@Profile 也能写多个值,任一匹配即生效:

@Profile({"sunny", "default"})

@Configuration 类和 @ConfigurationProperties 类同样支持 @Profile。

Tip

故意留一个实现给 default profile,保证不激活任何 profile 时应用也能跑起来。

Profile 表达式

@Profile 的值支持更复杂的表达式:

// 非 prod 环境生效
@Profile("!prod")

// dev 且 mysql 同时激活才生效
@Profile("dev & mysql")

// dev 或 test 任一激活就生效
@Profile("dev | test")

三个符号的含义:

  • !:取反。
  • &:与,两边都得激活。
  • |:或,激活一个就行。

混合使用 &| 时必须用括号分组。@Profile 不能重复标注,多个条件要用同一个注解内的 & 表达「与」。

Profile 命名规范

官方对 profile 名有约束:

  • 只能包含字母、数字和 -_.+@
  • 开头结尾必须是字母或数字。

小写短横线风格最稳:devtestprodmy-env

别用中文、空格、括号,省得解析出幺蛾子。

Profile 分组

profile 太细碎时,用分组聚合。比如 proddbprodmq 两个 profile,组成 production 组:

spring:
  profiles:
    group:
      production:
        - proddb
        - prodmq

激活 production 一个,等于同时激活三个:

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

补充激活:spring.profiles.include

想在任何环境都追加某些 profile,用 include:

spring:
  profiles:
    include:
      - common
      - monitoring

命令行 --spring.profiles.active=dev 激活 dev 时,common 和 monitoring 也会跟着激活。

include 的 profile 排在 active 之前加载,同名属性以 active 的 profile 文件为准。

单文件多文档写法

YAML 支持用 --- 拆多个文档,每个文档用 spring.config.activate.on-profile 声明归属:

spring:
  application:
    name: hello-app

---
spring:
  config:
    activate:
      on-profile: dev
server:
  port: 8081

---
spring:
  config:
    activate:
      on-profile: prod
server:
  port: 443

一个小项目就一个文件,不用拆三个文件。项目大了还是建议拆文件,好找好维护。

properties 文件也能多文档,分隔符是 #---

spring.application.name=hello-app
#---
spring.config.activate.on-profile=dev
server.port=8081

程序化激活

测试代码里用注解激活:

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;

@SpringBootTest
@ActiveProfiles("dev")
class ApplicationTests {
}

@ActiveProfiles 也能写多个,测多 profile 叠加的场景:

@ActiveProfiles({"dev", "local"})

主类里也可以设置附加 profile:

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

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        application.setAdditionalProfiles("monitoring");
        application.run(args);
    }
}

setAdditionalProfilesspring.profiles.include 效果类似,都在 active 之外追加。

多 profile 叠加时的覆盖顺序

激活两个以上 profile 时,后写的赢。

假设 --spring.profiles.active=prod,live,那么:

  • application-prod.yml 先加载。
  • application-live.yml 后加载。
  • 同名属性以 live 为准。

列表也是整体替换,不会合并。这一点和第 17 章的复杂类型合并规则一致。

想要「基础环境 + 叠加环境」的效果,组合用 include 或分组,别靠文件顺序碰运气。

小结

  • 文件命名 application-{profile}.yml,profile 文件覆盖公共文件。
  • 激活方式:配置文件、命令行、环境变量,优先级依次升高。
  • 不激活时默认 profile 是 default
  • @Profile 控制 Bean 按环境加载,支持 !&| 表达式。
  • profile 可以分组、可以 include,也能写进多文档 YAML。
  • 多 profile 叠加时后写的赢,列表整体替换。