Spring Boot Profile特定配置的底层机制
Profile机制实现不同环境下的配置隔离和切换。
Profile激活方式
配置文件激活
YAML
spring:
profiles:
active: dev
命令行参数
Bash
java -jar app.jar --spring.profiles.active=prod
环境变量
Bash
export SPRING_PROFILES_ACTIVE=prod
java -jar app.jar
SpringApplication设置
Java
SpringApplication app = new SpringApplication(App.class);
app.setAdditionalProfiles("dev", "local");
app.run(args);
Profile注解
Java
@Configuration
@Profile("dev")
public class DevConfiguration {
// 仅dev Profile激活时生效
}
@Service
@Profile("!prod") // 非prod环境
public class MockDataService { }
配置文件命名与加载
命名规则
YAML
application.yml # 基础配置
application-{profile}.yml # Profile特定配置
加载顺序
YAML
1. application.yml # 先加载基础配置
2. application-dev.yml # 后加载Profile配置(覆盖基础)
3. application-dev.yml(外置) # 外置Profile配置最高优先级
Bash
# application.yml
server:
port: 8080
# application-dev.yml
server:
port: 8081 # 覆盖基础配置
# 最终生效:port=8081
Profile配置文件优先级
| 配置文件 | 优先级 |
|---|---|
| 外置application-{profile}.yml | 最高 |
| 内置application-{profile}.yml | 高 |
| 外置application.yml | 中 |
| 内置application.yml | 低 |
Profile配置覆盖基础配置的同名属性,基础配置的非同名属性保留。
多Profile激活
YAML
# 激活多个Profile
spring:
profiles:
active: dev,mysql,redis
# 加载配置文件
application.yml
application-dev.yml
application-mysql.yml
application-redis.yml
# 按声明顺序加载,后者覆盖前者同名属性
Java
# 命令行激活多个
java -jar app.jar --spring.profiles.active=dev,mysql
Profile分组
Java
# Spring Boot 2.4+
spring:
profiles:
group:
prod:
- prod-db
- prod-cache
dev:
- dev-db
- dev-mock
active: prod
# 激活prod时自动激活prod-db和prod-cache
条件化Bean注册
Java
@Configuration
public class DataSourceConfig {
@Bean
@Profile("dev")
public DataSource devDataSource() {
return new EmbeddedDatabaseBuilder().build();
}
@Bean
@Profile("prod")
public DataSource prodDataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://prod-db:3306/mydb");
return ds;
}
}
Profile条件注解
Java
@Profile("dev") // Profile为dev时生效
@Profile("!prod") // Profile不为prod时生效
@Profile({"dev", "test"}) // Profile为dev或test时生效
底层机制
AbstractEnvironment处理
YAML
public class StandardEnvironment extends AbstractEnvironment {
// PropertySource链
// 1. 命令行参数
// 2. 系统属性
// 3. 环境变量
// 4. 配置文件(按Profile顺序)
}
ProfileDetector
Bash
// ConfigFileApplicationListener检测Profile
// 根据spring.profiles.active配置加载对应配置文件
Profile默认值
YAML
# 默认Profile(未指定active时生效)
spring:
profiles:
default: dev
text
# 未指定active时使用default
java -jar app.jar # Profile为dev
配置文件包含
text
# application.yml
spring:
profiles:
include: common,shared
# 无论激活哪个Profile,都加载include指定的配置
要点总结
- 多种方式激活Profile:配置、命令行、环境变量
- application-{profile}.yml覆盖application.yml同名属性
- 多Profile按声明顺序加载,后者覆盖前者
- Profile分组(2.4+)简化多Profile管理
- @Profile注解条件化注册Bean
- default配置设置默认Profile
📝 发现内容有误?点击此处直接编辑