全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-18 6 分钟 ✍️ juanwangdev

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

📝 发现内容有误?点击此处直接编辑

← 上一篇 Spring Boot 自定义自动配置
下一篇 → Spring Boot 命令行参数覆盖
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库