环境要求
| 项 | 要求 |
|---|---|
| JDK | 17 或更高 |
| Spring Boot | 3.2.x ~ 4.1.x(同一个 jar 通吃) |
| 构建工具 | Maven / Gradle 均可 |
| 数据库 | 框架不绑定,仓储层自己实现 |
不想手动搭工程? 去 https://start.soda.hibuka.com 生成一个 —— 内置 H2 内存库,解压就能 mvn spring-boot:run,不用装 MySQL 和 Redis。见 五分钟跑通,那一页会带你把示例代码读一遍。
soda 用 spring-boot-dependencies 做 BOM 管理版本,你自己的工程只要也引了 Spring Boot 的依赖管理,版本就自动对齐 —— soda 不需要单独指定 Spring Boot 版本。
引入核心依赖
soda-core-base 是核心包,包含命令总线、查询总线、事件总线、CQRS 切面、领域事件与上下文传递。
<dependency>
<groupId>com.hibuka.soda</groupId>
<artifactId>soda-core-base</artifactId>
<version>17.0.1</version>
</dependency>Gradle:
implementation 'com.hibuka.soda:soda-core-base:17.0.1'上面坐标里的版本号是文档构建时自动填入的。最新版本以 Maven 仓库为准 —— 查 com.hibuka.soda:soda-core-base 的仓库页,或看 版本与兼容。
可选:Redis 事件总线
默认用的是进程内事件总线 —— 事件只在同一个 JVM 里投递。要让事件跨服务投递(服务 A 写库,触发服务 B 的逻辑),加上 soda-event-redis:
<dependency>
<groupId>com.hibuka.soda</groupId>
<artifactId>soda-event-redis</artifactId>
<version>17.0.1</version>
</dependency>它基于 Redis Streams,带消费组、幂等键和死信流。
soda-event-redis 是可选依赖。不想跨服务投递就别加,包体小很多,也没有 Redis 依赖。
自动装配做了什么
加上依赖之后不需要写任何 @Configuration,Spring Boot 的自动装配会注册这些 Bean:
| 自动配置类 | 作用 |
|---|---|
SpringBusAutoConfiguration | 始终生效:注册 CommandBus、QueryBus、cqrsAsyncExecutor、BusFacade。名字有误导性 —— 它跟 Spring 事件无关,是所有模式下的 CQRS 骨架 |
SimpleEventBusAutoConfiguration | bus-type=simple 或没配时生效:注册 SimpleEventBus(matchIfMissing = true) |
RepositoryEventAutoConfiguration | 容器里有 EventBus 时生效:注册 RepositoryEventAspect —— 保存聚合根时自动发布挂起的领域事件 |
RedisEventBusAutoConfiguration | bus-type=redis 时生效(需要 soda-event-redis):注册 Redis Streams 事件总线 |
BusFacade 始终可用,它是你在业务代码里发命令、发查询的入口。
切换事件总线类型
在 application.yaml 里:
soda:
event:
bus-type: simple # simple | redis| 值 | 效果 |
|---|---|
| 不配置 | SimpleEventBus —— 进程内,无外部依赖 |
simple | 同上,显式写出来意图更清楚。推荐 |
redis | Redis Streams,需要 soda-event-redis 依赖 + Redis 配置,可跨服务投递 |
spring | ⚠️ 当前版本没有这个实现。会一个 EventBus 都不创建,领域事件静默失效 |
EventProperties 的字段默认值还是 "spring",但 soda-event-spring 模块在 17.0.1 已经删除。别写 spring —— 不报错,但事件永远发不出去。不配置反而安全(回落到 Simple)。
验证装好了
新建一个空工程,启动 Spring Boot,能看到 soda 的自动装配日志就说明依赖没问题:
@SpringBootApplication
public class SodaApplication {
public static void main(String[] args) {
SpringApplication.run(SodaApplication.class, args);
}
}下一步:五分钟跑通。