從聚合根釋出事件

由 repositories 管理的實體是聚合根。在領域驅動設計(Domain-Driven Design)的應用中,這些聚合根通常會發布領域事件。Spring Data 提供了一個名為 @DomainEvents 的註解,你可以用在聚合根的方法上,以儘可能方便地進行事件釋出,如下例所示。

從聚合根暴露領域事件
class AnAggregateRoot {

    @DomainEvents (1)
    Collection<Object> domainEvents() {
        // … return events you want to get published here
    }

    @AfterDomainEventPublication (2)
    void callbackMethod() {
       // … potentially clean up domain events list
    }
}
1 使用 @DomainEvents 的方法可以返回單個事件例項或事件集合。它不能接受任何引數。
2 所有事件釋出後,我們有一個帶有 @AfterDomainEventPublication 註解的方法。你可以用它來清除待發布的事件列表(以及其他用途)。

每次呼叫以下 Spring Data repository 方法時,都會呼叫這些方法:

  • save(…), saveAll(…)

  • delete(…), deleteAll(…), deleteAllInBatch(…), deleteInBatch(…)

請注意,這些方法接受聚合根例項作為引數。這就是為什麼 deleteById(…) 方法明顯缺失的原因,因為實現可能會選擇發出一個查詢來刪除例項,這樣我們就無法首先訪問聚合例項。