simba-spring-boot-starter 模块
simba-spring-boot-starter 模块为所有三个 Simba 后端(JDBC、Redis、Zookeeper)提供 Spring Boot 自动配置。它使用条件注解和 Gradle 功能变体,使应用只引入所选后端的依赖。
自动配置类
该模块通过 Spring Boot 的标准机制注册三个自动配置类。
源码: simba-spring-boot-starter/.../org.springframework.boot.autoconfigure.AutoConfiguration.imports
me.ahoo.simba.spring.boot.starter.jdbc.SimbaJdbcAutoConfiguration
me.ahoo.simba.spring.boot.starter.redis.SimbaSpringRedisAutoConfiguration
me.ahoo.simba.spring.boot.starter.zookeeper.SimbaZookeeperAutoConfiguration配置流程
graph TD
subgraph sg_99 ["Application Startup"]
APP["SpringApplication"]
end
subgraph sg_100 ["Conditional Evaluation"]
CE1["simba.enabled = true?"]
CE2["simba.jdbc.enabled = true?<br>+ JdbcMutexContendServiceFactory on classpath?<br>+ DataSource bean exists?"]
CE3["simba.redis.enabled = true?<br>+ StringRedisTemplate on classpath?<br>+ RedisConnectionFactory exists?"]
CE4["simba.zookeeper.enabled = true?<br>+ ZookeeperMutexContendServiceFactory on classpath?<br>+ CuratorFramework bean exists?"]
end
subgraph sg_101 ["Beans Registered"]
B1["MutexOwnerRepository<br>JdbcMutexContendServiceFactory"]
B2["RedisMessageListenerContainer<br>SpringRedisMutexContendServiceFactory"]
B3["ZookeeperMutexContendServiceFactory"]
end
APP --> CE1
CE1 -->|"true"| CE2
CE1 -->|"true"| CE3
CE1 -->|"true"| CE4
CE1 -->|"false"| NONE["No Simba beans"]
CE2 -->|"all match"| B1
CE3 -->|"all match"| B2
CE4 -->|"all match"| B3
style APP fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style CE1 fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style CE2 fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style CE3 fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style CE4 fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style B1 fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style B2 fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style B3 fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style NONE fill:#2d333b,stroke:#6d5dfc,color:#e6edf3条件注解
该模块使用两级条件注解层次结构:
graph TD
subgraph sg_102 ["Annotation Hierarchy"]
CSE["@ConditionalOnSimbaEnabled<br>simba.enabled = true"]
CJDBC["@ConditionalOnSimbaJdbcEnabled<br>@ConditionalOnSimbaEnabled<br>+ simba.jdbc.enabled = true"]
CREDIS["@ConditionalOnSimbaRedisEnabled<br>@ConditionalOnSimbaEnabled<br>+ simba.redis.enabled = true"]
CZK["@ConditionalOnSimbaZookeeperEnabled<br>@ConditionalOnSimbaEnabled<br>+ simba.zookeeper.enabled = true"]
end
CJDBC --> CSE
CREDIS --> CSE
CZK --> CSE
style CSE fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style CJDBC fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style CREDIS fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style CZK fill:#2d333b,stroke:#6d5dfc,color:#e6edf3ConditionalOnSimbaEnabled
源码: simba-spring-boot-starter/.../ConditionalOnSimbaEnabled.kt:23
@ConditionalOnProperty(
value = ["simba.enabled"],
matchIfMissing = true,
havingValue = "true"
)
annotation class ConditionalOnSimbaEnabled全局开关。属性未设置时默认为 true。
ConditionalOnSimbaJdbcEnabled
源码: simba-spring-boot-starter/.../ConditionalOnSimbaJdbcEnabled.kt:24
@ConditionalOnSimbaEnabled
@ConditionalOnProperty(
value = ["simba.jdbc.enabled"],
matchIfMissing = true,
havingValue = "true"
)
annotation class ConditionalOnSimbaJdbcEnabledConditionalOnSimbaRedisEnabled
源码: simba-spring-boot-starter/.../ConditionalOnSimbaRedisEnabled.kt:28
@ConditionalOnSimbaEnabled
@ConditionalOnProperty(
value = ["simba.redis.enabled"],
matchIfMissing = true,
havingValue = "true"
)
annotation class ConditionalOnSimbaRedisEnabledConditionalOnSimbaZookeeperEnabled
源码: simba-spring-boot-starter/.../ConditionalOnSimbaZookeeperEnabled.kt:26
@ConditionalOnSimbaEnabled
@ConditionalOnProperty(
value = ["simba.zookeeper.enabled"],
matchIfMissing = true,
havingValue = "true"
)
annotation class ConditionalOnSimbaZookeeperEnabled自动配置详情
SimbaJdbcAutoConfiguration
源码: simba-spring-boot-starter/.../SimbaJdbcAutoConfiguration.kt:32
@AutoConfiguration
@ConditionalOnSimbaJdbcEnabled
@ConditionalOnClass(JdbcMutexContendServiceFactory::class)
@EnableConfigurationProperties(JdbcProperties::class)
class SimbaJdbcAutoConfiguration(private val jdbcProperties: JdbcProperties) {
@Bean @ConditionalOnMissingBean
fun mutexOwnerRepository(dataSource: DataSource): MutexOwnerRepository
@Bean @ConditionalOnMissingBean
fun jdbcMutexContendServiceFactory(mutexOwnerRepository: MutexOwnerRepository): MutexContendServiceFactory
}| 条件 | Bean |
|---|---|
simba.jdbc.enabled = true + JdbcMutexContendServiceFactory 在类路径上 + DataSource Bean 存在 | MutexOwnerRepository |
同上 + MutexOwnerRepository Bean 存在 | MutexContendServiceFactory(即 JdbcMutexContendServiceFactory) |
SimbaSpringRedisAutoConfiguration
源码: simba-spring-boot-starter/.../SimbaSpringRedisAutoConfiguration.kt:34
@AutoConfiguration(after = [DataRedisAutoConfiguration::class])
@ConditionalOnSimbaRedisEnabled
@ConditionalOnClass(StringRedisTemplate::class)
@EnableConfigurationProperties(RedisProperties::class)
class SimbaSpringRedisAutoConfiguration(private val redisProperties: RedisProperties) {
@Bean @ConditionalOnMissingBean @ConditionalOnSingleCandidate(RedisConnectionFactory::class)
fun simbaRedisMessageListenerContainer(connectionFactory: RedisConnectionFactory): RedisMessageListenerContainer
@Bean @ConditionalOnMissingBean @ConditionalOnBean(StringRedisTemplate::class)
fun redisMutexContendServiceFactory(
redisTemplate: StringRedisTemplate,
listenerContainer: RedisMessageListenerContainer
): MutexContendServiceFactory
}| 条件 | Bean |
|---|---|
simba.redis.enabled = true + StringRedisTemplate 在类路径上 + RedisConnectionFactory 存在 | RedisMessageListenerContainer |
同上 + StringRedisTemplate Bean 存在 | MutexContendServiceFactory(即 SpringRedisMutexContendServiceFactory) |
该配置运行在 after = DataRedisAutoConfiguration 之后,以确保 Redis 基础设施 Bean 可用。
SimbaZookeeperAutoConfiguration
源码: simba-spring-boot-starter/.../SimbaZookeeperAutoConfiguration.kt:30
@AutoConfiguration
@ConditionalOnSimbaZookeeperEnabled
@ConditionalOnClass(ZookeeperMutexContendServiceFactory::class)
@EnableConfigurationProperties(ZookeeperProperties::class)
class SimbaZookeeperAutoConfiguration {
@Bean @ConditionalOnBean(CuratorFramework::class) @ConditionalOnMissingBean
fun zookeeperMutexContendServiceFactory(curatorFramework: CuratorFramework): ZookeeperMutexContendServiceFactory
}| 条件 | Bean |
|---|---|
simba.zookeeper.enabled = true + ZookeeperMutexContendServiceFactory 在类路径上 + CuratorFramework Bean 存在 | MutexContendServiceFactory(即 ZookeeperMutexContendServiceFactory) |
属性绑定
所有属性绑定在 simba 前缀下。
完整属性参考
simba:
enabled: true # 全局开关(默认: true)
jdbc:
enabled: true # JDBC 后端(默认: true)
initial-delay: 0s # 首次竞争前的延迟
ttl: 10s # 锁 TTL
transition: 6s # 宽限期
redis:
enabled: true # Redis 后端(默认: true)
ttl: 10s # 锁 TTL
transition: 6s # 宽限期
zookeeper:
enabled: true # Zookeeper 后端(默认: true)| 属性 | 来源类 | 默认值 |
|---|---|---|
simba.enabled | ConditionalOnSimbaEnabled | true |
simba.jdbc.enabled | JdbcProperties | true |
simba.jdbc.initial-delay | JdbcProperties | 0s |
simba.jdbc.ttl | JdbcProperties | 10s |
simba.jdbc.transition | JdbcProperties | 6s |
simba.redis.enabled | RedisProperties | true |
simba.redis.ttl | RedisProperties | 10s |
simba.redis.transition | RedisProperties | 6s |
simba.zookeeper.enabled | ZookeeperProperties | true |
Gradle 功能变体
该 starter 使用 Gradle 的 registerFeature 创建可选的功能变体。这确保消费者只引入所需的后端依赖。
源码: simba-spring-boot-starter/build.gradle.kts:18
java {
registerFeature("springRedisSupport") {
usingSourceSet(sourceSets[SourceSet.MAIN_SOURCE_SET_NAME])
capability(group.toString(), "spring-redis-support", version.toString())
}
registerFeature("jdbcSupport") {
usingSourceSet(sourceSets[SourceSet.MAIN_SOURCE_SET_NAME])
capability(group.toString(), "jdbc-support", version.toString())
}
registerFeature("zookeeperSupport") {
usingSourceSet(sourceSets[SourceSet.MAIN_SOURCE_SET_NAME])
capability(group.toString(), "zookeeper-support", version.toString())
}
}graph TD
subgraph sg_103 ["Consumer Dependencies"]
C1["Application A<br>requires spring-redis-support"]
C2["Application B<br>requires jdbc-support"]
C3["Application C<br>requires zookeeper-support"]
end
subgraph sg_104 ["simba-spring-boot-starter Features"]
SR["springRedisSupport<br>-> simba-spring-redis<br>-> spring-boot-starter-data-redis"]
JB["jdbcSupport<br>-> simba-jdbc"]
ZK["zookeeperSupport<br>-> simba-zookeeper"]
end
subgraph sg_105 ["Always Included"]
CORE["simba-core<br>spring-boot-starter"]
end
C1 -->|"capability"| SR
C2 -->|"capability"| JB
C3 -->|"capability"| ZK
style C1 fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style C2 fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style C3 fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style SR fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style JB fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style ZK fill:#2d333b,stroke:#6d5dfc,color:#e6edf3
style CORE fill:#2d333b,stroke:#6d5dfc,color:#e6edf3使用功能变体
在消费应用的 build.gradle.kts 中:
dependencies {
// 仅引入 Redis 后端
implementation("me.ahoo.simba:simba-spring-boot-starter") {
capabilities {
requireCapability("me.ahoo.simba:spring-redis-support")
}
}
}这会引入 simba-spring-redis 和 spring-boot-starter-data-redis,但不会引入 simba-jdbc 或 simba-zookeeper。
Enabled 后缀约定
所有后端的 enabled 属性使用 .enabled 后缀常量:
源码: simba-spring-boot-starter/.../EnabledSuffix.kt:20
object EnabledSuffix {
const val KEY = ".enabled"
}禁用后端
禁用所有 Simba
simba:
enabled: false禁用特定后端
simba:
jdbc:
enabled: false
redis:
enabled: false
zookeeper:
enabled: false仅启用一个后端
simba:
jdbc:
enabled: false
redis:
enabled: true
ttl: 15s
transition: 8s
zookeeper:
enabled: false另请参阅
- simba-core 模块 -- 核心接口和抽象类
- simba-jdbc -- JDBC 后端详情和属性
- simba-spring-redis -- Redis 后端详情和 Lua 脚本
- simba-zookeeper -- Zookeeper 后端详情