Documentation
¶
Overview ¶
Package condition 提供条件化注册功能,用于 enhance 框架。
该模块支持根据条件动态决定是否注册 Bean 或执行自动配置。 参考 Spring Boot 的 @Conditional 注解设计。
架构设计 ¶
- Condition: 条件接口,定义条件判断逻辑
- ConditionContext: 条件上下文接口
- EnvironmentAccessor: 环境配置访问接口
- ContainerAccessor: 容器访问接口
- OnProperty: 基于配置属性的条件
- OnModuleLoaded: 基于模块加载的条件(替代 Java 的 OnClass)
- OnBean: 基于 Bean 存在的条件
- OnMissingBean: 基于 Bean 缺失的条件
- 条件组合: 支持 AND、OR、NOT 逻辑组合
内置条件 ¶
- OnProperty: 检查配置属性是否存在或等于特定值
- OnModuleLoaded: 检查指定模块是否已加载(Go 替代方案)
- OnBean: 检查指定 Bean 是否已注册
- OnMissingBean: 检查指定 Bean 是否未注册
- OnMissingModule: 检查指定模块是否未加载
使用方式 ¶
在自动配置中使用条件:
type MyAutoConfiguration struct{}
func (m *MyAutoConfiguration) Configure(ctx boot.ApplicationContext) error {
// 配置逻辑
return nil
}
func init() {
boot.RegisterAutoConfig(
&MyAutoConfiguration{},
condition.OnProperty("my.feature.enabled", "true"),
)
}
条件组合 ¶
支持多个条件的逻辑组合:
condition.And(
condition.OnProperty("feature.enabled", "true"),
condition.OnMissingBean("customService"),
)
condition.Or(
condition.OnProperty("env", "dev"),
condition.OnProperty("env", "test"),
)
Index ¶
- func AllWithOptions(opts ...CompositeOption) func(conditions ...Condition) Condition
- type CompositeOption
- type Condition
- func All(conditions ...Condition) Condition
- func AllFunc(fns ...func(ctx ConditionContext) bool) Condition
- func Always() Condition
- func Any(conditions ...Condition) Condition
- func AnyFunc(fns ...func(ctx ConditionContext) bool) Condition
- func Custom(name string, evaluator func(ctx ConditionContext) bool) Condition
- func Func(fn func(ctx ConditionContext) bool) Condition
- func Never() Condition
- func Not(condition Condition) Condition
- func OnBean(beanID string) Condition
- func OnEnvVarExists(envVar string) Condition
- func OnEnvVarMissing(envVar string) Condition
- func OnExpression(expression string) Condition
- func OnMissingBean(beanID string) Condition
- func OnMissingModule(moduleName string) Condition
- func OnMissingProperty(key string) Condition
- func OnModuleLoaded(moduleName string) Condition
- func OnProfile(profile string) Condition
- func OnProperty(key string, expectedValue ...string) Condition
- func OnPropertyPrefix(prefix string) Condition
- func OnResourceExists(location string) Condition
- func OnResourceMissing(location string) Condition
- func When(description string, fn func(ctx ConditionContext) bool) Condition
- type ConditionBuilder
- func (b *ConditionBuilder) All(conditions ...Condition) *ConditionBuilder
- func (b *ConditionBuilder) And() *ConditionBuilder
- func (b *ConditionBuilder) Any(conditions ...Condition) *ConditionBuilder
- func (b *ConditionBuilder) Build() Condition
- func (b *ConditionBuilder) Not() *ConditionBuilder
- func (b *ConditionBuilder) OnBean(beanID string) *ConditionBuilder
- func (b *ConditionBuilder) OnEnvVarExists(envVar string) *ConditionBuilder
- func (b *ConditionBuilder) OnEnvVarMissing(envVar string) *ConditionBuilder
- func (b *ConditionBuilder) OnExpression(expression string) *ConditionBuilder
- func (b *ConditionBuilder) OnMissingBean(beanID string) *ConditionBuilder
- func (b *ConditionBuilder) OnMissingModule(moduleName string) *ConditionBuilder
- func (b *ConditionBuilder) OnMissingProperty(key string) *ConditionBuilder
- func (b *ConditionBuilder) OnModuleLoaded(moduleName string) *ConditionBuilder
- func (b *ConditionBuilder) OnProfile(profile string) *ConditionBuilder
- func (b *ConditionBuilder) OnProperty(key string, expectedValue ...string) *ConditionBuilder
- func (b *ConditionBuilder) OnResourceExists(location string) *ConditionBuilder
- func (b *ConditionBuilder) OnResourceMissing(location string) *ConditionBuilder
- func (b *ConditionBuilder) Or() *ConditionBuilder
- type ConditionBuilderGroup
- type ConditionContext
- type ConditionFunc
- type ContainerAccessor
- type EnvironmentAccessor
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func AllWithOptions ¶
func AllWithOptions(opts ...CompositeOption) func(conditions ...Condition) Condition
AllWithOptions 返回一个带选项的复合条件
Types ¶
type CompositeOption ¶
type CompositeOption func(*compositeConfig)
CompositeOption 复合条件选项函数
func WithLazyEvaluation ¶
func WithLazyEvaluation() CompositeOption
WithLazyEvaluation 启用惰性求值(短路优化) All 和 Any 默认已经支持短路优化,此选项用于显式声明
type Condition ¶
type Condition interface {
// Matches 评估条件是否匹配。
Matches(ctx ConditionContext) bool
// String 返回条件的可读描述,用于日志输出。
String() string
}
Condition 条件接口。
参考 Spring Boot 的 @Conditional 注解体系。 用于在 AutoConfiguration 中控制 Bean 是否注册。
func All ¶
All 返回一个复合条件,当所有子条件都匹配时返回 true(逻辑与运算)。 执行逻辑:遍历所有子条件,依次调用 Matches 方法:
- 只要有一个子条件不匹配,立即短路返回 false(不再继续判断后续条件)
- 所有子条件都匹配时返回 true
该行为与编程语言中的 && 运算符一致,支持短路优化。
func AllFunc ¶
func AllFunc(fns ...func(ctx ConditionContext) bool) Condition
AllFunc 创建函数类型的逻辑与条件
与 All() 等效,但直接接受函数而非 Condition 接口。
示例:
cond := condition.AllFunc(
func(ctx condition.ConditionContext) bool { return ctx.HasProperty("db.url") },
func(ctx condition.ConditionContext) bool { return ctx.HasProperty("db.password") },
)
func Any ¶
Any 返回一个复合条件,当任一子条件匹配时返回 true(逻辑或运算)。 执行逻辑:遍历所有子条件,依次调用 Matches 方法:
- 只要有一个子条件匹配,立即短路返回 true(不再继续判断后续条件)
- 所有子条件都不匹配时返回 false
该行为与编程语言中的 || 运算符一致,支持短路优化。
func AnyFunc ¶
func AnyFunc(fns ...func(ctx ConditionContext) bool) Condition
AnyFunc 创建函数类型的逻辑或条件
与 Any() 等效,但直接接受函数而非 Condition 接口。
示例:
cond := condition.AnyFunc(
func(ctx condition.ConditionContext) bool { return ctx.HasProperty("cache.redis.url") },
func(ctx condition.ConditionContext) bool { return ctx.HasProperty("cache.memcached.url") },
)
func Custom ¶
func Custom(name string, evaluator func(ctx ConditionContext) bool) Condition
Custom 创建自定义条件
通过传入的评估函数决定是否匹配,name 用于日志和调试输出。
func Func ¶
func Func(fn func(ctx ConditionContext) bool) Condition
Func 将普通函数包装为 Condition
便捷函数,用于快速创建条件。
示例:
cond := condition.Func(func(ctx condition.ConditionContext) bool {
return os.Getenv("ENABLE_FEATURE") == "1"
})
func Not ¶
Not 返回一个复合条件,对子条件的匹配结果取反(逻辑非运算)。 执行逻辑:调用子条件的 Matches 方法,然后对其结果取反:
- 子条件匹配时返回 false
- 子条件不匹配时返回 true
该行为与编程语言中的 ! 运算符一致。
func OnEnvVarExists ¶
OnEnvVarExists 创建基于环境变量存在性的条件
当指定的环境变量存在时匹配。
示例:
condition.OnEnvVarExists("DATABASE_URL")
condition.OnEnvVarExists("REDIS_HOST")
func OnExpression ¶
OnExpression 创建基于 SpEL 表达式的条件
表达式支持以下语法:
- 属性引用: ${server.port} 或 server.port
- 比较运算: >, <, >=, <=, ==, !=
- 逻辑运算: &&, ||, !
- 三元运算: condition ? trueVal : falseVal
- 字面量: 字符串、数字、布尔值
示例:
condition.OnExpression("${server.port} > 8080")
condition.OnExpression("${app.env} == 'prod' && ${debug.enabled} == false")
func OnModuleLoaded ¶
OnModuleLoaded 创建基于模块加载的条件
当指定模块已加载到容器中时匹配。 Go 中不支持 Java 的 Class.forName() 动态类加载,改用模块名称检查。
func OnResourceExists ¶
OnResourceExists 创建基于资源存在性的条件
支持以下资源前缀:
- classpath: - 类路径资源(Go 中检查文件是否存在)
- file: - 文件系统资源
- 无前缀 - 默认为 classpath
示例:
condition.OnResourceExists("classpath:config.yml")
condition.OnResourceExists("file:/etc/app/config.json")
condition.OnResourceExists("config.yml") // 等同于 classpath:config.yml
func When ¶
func When(description string, fn func(ctx ConditionContext) bool) Condition
When 创建带描述的条件
在 ConditionFunc 基础上增加可读的 String() 输出。
示例:
cond := condition.When("feature flag is enabled", func(ctx condition.ConditionContext) bool {
val, _ := ctx.GetProperty("feature.enabled")
return val == "true"
})
type ConditionBuilder ¶
type ConditionBuilder struct {
// contains filtered or unexported fields
}
ConditionBuilder 条件构建器,提供流式 DSL
示例:
condition.New().
OnProperty("feature.enabled", "true").
And().
OnBean("dataSource").
Or().
OnProfile("dev").
Build()
func (*ConditionBuilder) All ¶
func (b *ConditionBuilder) All(conditions ...Condition) *ConditionBuilder
All 添加一个 All 复合条件
func (*ConditionBuilder) Any ¶
func (b *ConditionBuilder) Any(conditions ...Condition) *ConditionBuilder
Any 添加一个 Any 复合条件
func (*ConditionBuilder) Not ¶
func (b *ConditionBuilder) Not() *ConditionBuilder
Not 添加逻辑非操作(对下一个条件取反)
func (*ConditionBuilder) OnBean ¶
func (b *ConditionBuilder) OnBean(beanID string) *ConditionBuilder
OnBean 添加 Bean 存在条件
func (*ConditionBuilder) OnEnvVarExists ¶
func (b *ConditionBuilder) OnEnvVarExists(envVar string) *ConditionBuilder
OnEnvVarExists 添加环境变量存在条件
func (*ConditionBuilder) OnEnvVarMissing ¶
func (b *ConditionBuilder) OnEnvVarMissing(envVar string) *ConditionBuilder
OnEnvVarMissing 添加环境变量缺失条件
func (*ConditionBuilder) OnExpression ¶
func (b *ConditionBuilder) OnExpression(expression string) *ConditionBuilder
OnExpression 添加表达式条件
func (*ConditionBuilder) OnMissingBean ¶
func (b *ConditionBuilder) OnMissingBean(beanID string) *ConditionBuilder
OnMissingBean 添加 Bean 缺失条件
func (*ConditionBuilder) OnMissingModule ¶
func (b *ConditionBuilder) OnMissingModule(moduleName string) *ConditionBuilder
OnMissingModule 添加模块缺失条件
func (*ConditionBuilder) OnMissingProperty ¶
func (b *ConditionBuilder) OnMissingProperty(key string) *ConditionBuilder
OnMissingProperty 添加属性缺失条件
func (*ConditionBuilder) OnModuleLoaded ¶
func (b *ConditionBuilder) OnModuleLoaded(moduleName string) *ConditionBuilder
OnModuleLoaded 添加模块加载条件
func (*ConditionBuilder) OnProfile ¶
func (b *ConditionBuilder) OnProfile(profile string) *ConditionBuilder
OnProfile 添加 Profile 条件
func (*ConditionBuilder) OnProperty ¶
func (b *ConditionBuilder) OnProperty(key string, expectedValue ...string) *ConditionBuilder
OnProperty 添加属性条件
func (*ConditionBuilder) OnResourceExists ¶
func (b *ConditionBuilder) OnResourceExists(location string) *ConditionBuilder
OnResourceExists 添加资源存在条件
func (*ConditionBuilder) OnResourceMissing ¶
func (b *ConditionBuilder) OnResourceMissing(location string) *ConditionBuilder
OnResourceMissing 添加资源缺失条件
type ConditionBuilderGroup ¶
type ConditionBuilderGroup struct {
// contains filtered or unexported fields
}
ConditionBuilderGroup 条件组构建器
func (ConditionBuilderGroup) And ¶
func (g ConditionBuilderGroup) And(conditions ...Condition) ConditionBuilderGroup
And 添加与条件组
func (ConditionBuilderGroup) Or ¶
func (g ConditionBuilderGroup) Or(conditions ...Condition) ConditionBuilderGroup
Or 添加或条件组
type ConditionContext ¶
type ConditionContext interface {
// Environment 返回环境配置,用于读取属性值。
Environment() EnvironmentAccessor
// Container 返回 DI 容器,用于检查 Bean 是否存在。
Container() ContainerAccessor
// GetBeanByType 从容器中按类型获取 Bean 实例。
GetBeanByType(t reflect.Type) (any, bool)
// HasProperty 检查属性是否存在。
HasProperty(key string) bool
// GetProperty 获取属性值。
GetProperty(key string) (any, bool)
}
ConditionContext 条件上下文。
提供条件判断所需的环境、容器和一些便捷方法。
type ConditionFunc ¶
type ConditionFunc func(ctx ConditionContext) bool
ConditionFunc 条件函数类型
这是 Condition 接口的函数式替代方案,适用于简单条件判断。 无需实现接口,直接写函数即可。
示例:
// 简单条件函数
cond := condition.ConditionFunc(func(ctx condition.ConditionContext) bool {
val, ok := ctx.GetProperty("feature.enabled")
return ok && val == "true"
})
// 或使用内置的 OnProperty 等函数(它们已经返回 Condition)
cond := condition.OnProperty("feature.enabled", "true")
func (ConditionFunc) Matches ¶
func (f ConditionFunc) Matches(ctx ConditionContext) bool
Matches 实现 Condition 接口
type ContainerAccessor ¶
ContainerAccessor 容器访问接口。
type EnvironmentAccessor ¶
EnvironmentAccessor 环境配置访问接口。