@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
表示 如果配置缺失,也会默认加载(适用于默认启用的功能)