好的,阿杰,我给你整理一份 Spring Boot 中 @ConditionalOnProperty
使用详解,包含概念、语法、示例以及常见应用场景。
🌟 Spring Boot @ConditionalOnProperty
详解
1. 什么是 @ConditionalOnProperty
?
@ConditionalOnProperty
是 Spring Boot 提供的条件注解之一,用于 根据配置文件中的属性值决定 Bean 是否加载。
特点:
- 典型场景:根据 application.properties/yml 配置来动态启用或禁用某个 Bean
- 可以与 自动配置(@Configuration) 搭配使用
- 属于 Spring Boot 的 条件化注解,其他类似注解还有:
@ConditionalOnClass
@ConditionalOnMissingBean
@ConditionalOnBean
@ConditionalOnExpression
2. 基本语法
@ConditionalOnProperty(
prefix = "配置前缀",
name = "属性名",
havingValue = "属性值",
matchIfMissing = false
)
属性 | 说明 |
---|---|
prefix | 属性前缀,例如 app.feature |
name | 属性名,例如 enabled |
havingValue | 当属性值等于此值时,Bean 才会加载(默认为空,即属性存在即可) |
matchIfMissing | 当属性不存在时是否匹配,true 表示 Bean 会被创建 |
3. 示例
3.1 简单示例
application.properties
feature.enabled=true
配置类
@Configuration
@ConditionalOnProperty(prefix = "feature", name = "enabled", havingValue = "true")
public class FeatureConfig {
@Bean
public MyFeatureService myFeatureService() {
return new MyFeatureService();
}
}
- 当
feature.enabled=true
时,MyFeatureService
会被创建 - 当
feature.enabled=false
或不存在时,Bean 不会加载
3.2 使用 matchIfMissing
@Configuration
@ConditionalOnProperty(prefix = "feature", name = "enabled", havingValue = "true", matchIfMissing = true)
public class DefaultFeatureConfig {
@Bean
public MyDefaultFeatureService defaultFeatureService() {
return new MyDefaultFeatureService();
}
}
- 即使配置文件没有
feature.enabled
,Bean 也会被创建 matchIfMissing = true
常用于默认启用功能
3.3 结合多个属性
@Configuration
@ConditionalOnProperty(
prefix = "feature",
name = {"enabled", "type"},
havingValue = "true"
)
public class MultiFeatureConfig {
@Bean
public MultiFeatureService multiFeatureService() {
return new MultiFeatureService();
}
}
- 多个属性都满足条件时,Bean 才会加载
havingValue
会应用到所有属性(全部匹配)
4. 常见应用场景
- 功能开关(Feature Toggle)
- 可以在配置文件中控制功能模块是否启用
- 例如:支付模块、日志模块、消息队列模块
- 动态选择不同实现
- 根据配置加载不同的 Bean 实现
- 例如:开发环境使用 Mock 服务,生产环境使用真实服务
- 与 Spring Boot 自动配置结合
- Spring Boot 核心自动配置也广泛使用
@ConditionalOnProperty
- 例如:
spring.autoconfigure.exclude
配置可以禁用某些自动配置
- Spring Boot 核心自动配置也广泛使用
5. 注意事项
- 属性类型:
havingValue
默认为字符串比较,如果属性是布尔类型true/false
,需用字符串表示"true"
- matchIfMissing:默认 false,意味着属性不存在时 Bean 不会创建
- 与
@ConditionalOnMissingBean
配合:可以实现 属性开启 + Bean 不存在 时才创建 Bean
6. 小结
@ConditionalOnProperty
是 基于配置文件控制 Bean 加载的条件注解- 核心用途:功能开关、动态配置、自动配置控制
- 配合
prefix
、name
、havingValue
和matchIfMissing
可以实现灵活控制
发表回复