2.8 领域事件
由于在DDD中采用了“设计小聚合”的原则,因此避免了领域模型的相互关联,从而避免了在应用演进中形成“大泥球”(Big Ball of Mud),也因为上述的原因,本书将不讲解@OneToMany、@ManyToMany等关联注解。聚合之间在没有了关联关系后,聚合之间的数据通讯通过领域事件来完成,领域事件是由聚合根发出的。
Spring Data对领域事件做了专门的支持,使用@DomainEvents
注解注册领域事件或者继承AbstractAggregateRoot
使用它的registerEvent
方法注册事件。
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class Person {
@DomainEvents // 使用集合类注册事件列表
Collection<Object> domainEvents(){
List<Object> events= new ArrayList<Object>();
events.add(new PersonSaved(this.id, this.name, this.age));
return events;
}
@AfterDomainEventPublication //所有事件发布完成后调用,一般用来清空事件列表
void callbackMethod() {
domainEvents().clear();
}
}
当Repository每一次调用save
方法时,领域事件都会被发布。
我们的领域事件定义:
import lombok.Value;
@Value
public class PersonSaved