從聚合根發布事件

由 repositories 管理的實體是聚合根。在領域驅動設計應用程式中,這些聚合根通常會發布領域事件。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(…)` 明顯缺席的原因,因為實作可能會選擇發出查詢來刪除實例,因此我們從一開始就無法訪問聚合實例。