Skip to content

Rain 核心模块

Rain 核心不只包含 Application。应用最常直接使用的三大能力是:

它们都接入 Application 的扫描和生命周期,但职责不同:

text
Application
├─ DI:谁创建对象、怎样注入依赖与配置
├─ Event:一个事实发生后,谁需要同步响应
└─ Job:一个任务应在什么时间被调用

模块选择

需求使用模块核心入口
构造服务并注入依赖DI构造器、@InjectDiContext
注入配置值DI@ConfigConfigManager
同一接口选择不同实现DI@AutoBind@Named
发布领域或生命周期事件EventEventBus.post
自动发现事件监听器Event@EventListener@SubscribeEvent
声明固定间隔任务Job@CronTab@Cron
运行时创建和取消任务JobJobBuilderJobManager

添加依赖

最常见的应用直接引入 Application 和需要的业务模块:

kotlin
dependencies {
    implementation("com.IceCreamQAQ.Rain:application:1.0.0-DEV12")
    implementation("com.IceCreamQAQ.Rain:event:1.0.0-DEV12")
    implementation("com.IceCreamQAQ.Rain:job:1.0.0-DEV12")
}

Application 已组合 DI、配置、类加载和 Hook。Event 与 Job 按需添加,不需要事件或任务时可以不引入。

DI:组装对象

Rain 会扫描应用包中的具体类,并按构造器参数递归创建依赖:

kotlin
class OrderRepository

class OrderService(
    private val repository: OrderRepository,
    @Config("order.maxItems") private val maxItems: Int,
)
properties
order.maxItems=100

这里没有 @Component:具体类只要在 rain.scanPackages 中且构造条件满足,就可以由容器创建。命名实例、集合注入、BeanFactory 和底层创建规则见 DI 与配置

Event:发布事实

定义事件、声明监听器,再从业务服务发布:

kotlin
data class OrderCreated(val orderId: Long) : Event

@EventListener
class OrderListener {
    @SubscribeEvent
    fun onCreated(event: OrderCreated) {
        println("created: ${event.orderId}")
    }
}

class OrderService(
    private val eventBus: EventBus,
) {
    fun create(orderId: Long) {
        eventBus.post(OrderCreated(orderId))
    }
}

EventBus 是同步、进程内分发。发布线程会执行监听器;它不是消息队列。权重、取消、异常和编程式注册见 Event 事件总线

Job:按时间调用

给可注入的类标记 @CronTab,给无参数方法标记 @Cron

kotlin
@CronTab
class CleanupJobs(
    private val cleanupService: CleanupService,
) {
    @Cron("10m")
    fun cleanup() {
        cleanupService.removeExpired()
    }
}

当前 @Cron 的字符串表示 Rain 时间间隔,不是标准 Cron 表达式。动态注册、取消、并发和异常事件见 Job 任务调度

三个模块如何协作

一个常见业务链是:DI 创建服务,Job 定时调用服务,服务发布 Event:

text
JobLoader 扫描 @CronTab

DI 创建 CleanupJobs 与 CleanupService

JobCenter 到时调用 cleanup()

CleanupService 完成清理并 EventBus.post

EventBus 同步调用匹配监听器

三者都依赖正确的扫描包。最小应用配置:

properties
rain.scanPackages=com.example.app

推荐阅读顺序

  1. DI 与配置:先理解对象如何创建,后两个模块都依赖它。
  2. Event 事件总线:理解 Loader 如何发现监听器并建立运行时注册。
  3. Job 任务调度:理解注解任务、动态 DSL 和 ApplicationService 生命周期。
  4. Application:从框架实现角度追踪三者如何接入统一启动链。

如果目标是开发新的 Rain 模块,而不是只使用现有能力,请继续阅读扩展点总览

基于 Apache License 2.0 发布