@ConditionalOnProperty 是 Spring Boot 提供的一个条件注解,用于控制某个 Bean 是否应该被加载,基于配置文件 (application.properties 或 application.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.properties 或 application.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
例如,如果需要根据某个类是否存在来决定是否加载 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 表示 如果配置缺失,也会默认加载(适用于默认启用的功能)