Profile 多环境配置
本教程共 48 篇 · 第 13 篇 · 更新于 2026-08-13 · 约 4 分钟阅读
本节目标:用 Profile 把开发、测试、生产配置分开管理,掌握文件命名、激活方式和 @Profile 注解。
为什么需要 Profile
同一个应用,开发连本地数据库,生产连线上数据库。
把两套配置写进一个文件,互相覆盖,乱成一团。
Profile 就是干这个的:给配置打标签,按需启用。
激活某个 Profile,对应的配置才生效。其余环境的配置不加载。
配置文件按环境拆分
命名规则:application-{profile}.yml。
比如 application-dev.yml 和 application-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故意留一个实现给
defaultprofile,保证不激活任何 profile 时应用也能跑起来。
Profile 表达式
@Profile 的值支持更复杂的表达式:
// 非 prod 环境生效
@Profile("!prod")
// dev 且 mysql 同时激活才生效
@Profile("dev & mysql")
// dev 或 test 任一激活就生效
@Profile("dev | test")
三个符号的含义:
!:取反。&:与,两边都得激活。|:或,激活一个就行。
混合使用 & 与 | 时必须用括号分组。@Profile 不能重复标注,多个条件要用同一个注解内的 & 表达「与」。
Profile 命名规范
官方对 profile 名有约束:
- 只能包含字母、数字和
-、_、.、+、@。 - 开头结尾必须是字母或数字。
小写短横线风格最稳:dev、test、prod、my-env。
别用中文、空格、括号,省得解析出幺蛾子。
Profile 分组
profile 太细碎时,用分组聚合。比如 proddb、prodmq 两个 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);
}
}
setAdditionalProfiles 和 spring.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 叠加时后写的赢,列表整体替换。