@ConditionalOnProperty 是 Spring Boot 提供的一个条件注解,用于控制某个 Bean 是否应该被加载,基于配置文件 (application.propertiesapplication.yml) 中的某个属性值


1. 语法

@ConditionalOnProperty(
    prefix = "myapp.feature",
    name = "enabled",
    havingValue = "true",
    matchIfMissing = false
)
  • prefix:属性的前缀,例如 myapp.feature,对应 application.properties 中的 myapp.feature.enabled

  • name:具体的属性名称,例如 enabled

  • havingValue:当配置值等于此值时,才会加载该 Bean。

  • matchIfMissing

    • true(默认 false):如果配置文件中缺少该属性,则加载该 Bean。

    • false:如果缺少该属性,则不加载该 Bean。

2. 作用

application.propertiesapplication.yml 中的 myapp.feature.enabled=true 时,Spring 会创建 MyService 这个 Bean,否则不会创建。

1)有条件加载 Bean

@Configuration
public class MyConfig {
    @Bean
    @ConditionalOnProperty(prefix = "myapp.feature", name = "enabled", havingValue = "true")
    public MyService myService() {
        return new MyService();
    }
}
myapp.feature.enabled=true  # 只有 true 时才会加载 MyService

如果 myapp.feature.enabled=false,那么 myService() 这个 Bean 不会被创建

(2)应用于 Spring Boot 自动配置

@ConditionalOnProperty 常用于 Spring Boot Starter 自动配置,允许用户通过 application.properties 选择是否启用某些功能。

示例:Spring Boot 默认提供的 @ConditionalOnProperty

@Configuration
@ConditionalOnProperty(name = "spring.datasource.enabled", havingValue = "true", matchIfMissing = true)
public class DataSourceConfig {
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

如果 application.properties 里写:

spring.datasource.enabled=false

那么 DataSourceConfig 里的 dataSource() 不会被加载

3. matchIfMissing 参数的作用

如果 matchIfMissing=true,即使配置文件中没有 myapp.feature.enabled,也会默认加载 Bean

@Bean
@ConditionalOnProperty(prefix = "myapp.feature", name = "enabled", havingValue = "true", matchIfMissing = true)
public MyService myService() {
    return new MyService();
}
  • myapp.feature.enabled=true加载 Bean

  • myapp.feature.enabled=false不加载 Bean

  • 没有 myapp.feature.enabled 配置时仍然加载 Bean ✅(因为 matchIfMissing=true

4. @ConditionalOnProperty vs @Conditional

注解

作用

@ConditionalOnProperty

根据 配置文件 里的值决定是否创建 Bean

@Conditional

允许更复杂的 自定义条件

例如,如果需要根据某个类是否存在来决定是否加载 Bean,可以用 @Conditional

@Bean
@ConditionalOnClass(name = "com.mysql.cj.jdbc.Driver")
public DataSource mysqlDataSource() {
    return new MysqlDataSource();
}

这个 Bean 只有在 mysql-connector-java 依赖存在时才会被加载

总结

@ConditionalOnProperty 让我们可以通过 配置文件 控制某个 Bean 是否加载,常用于 Spring Boot 自动配置。
✅ 适用于 可选功能 的场景,比如开关某个功能、选择不同的数据源等。
matchIfMissing=true 表示 如果配置缺失,也会默认加载(适用于默认启用的功能)