美文网首页
Spring Data JPA @DomainEvents发布领

Spring Data JPA @DomainEvents发布领

作者: 饱饱想要的灵感 | 来源:发表于2023-12-25 09:34 被阅读0次

一、@DomainEvents

spring官方文档

@DomainEvents 是 Spring Data 的注解之一,用于发布领域事件。

领域事件是指反映系统内部状态更改的事件。该注解通常用于聚合根类,它从聚合根中收集要发布的事件,并在事务成功提交后发布这些事件。

通俗地讲, 每个Entity类都可以作为聚合根类Aggregate Root, 并具备发布domain event的能力, 即每次调用Spring Data Repository 的save(...)saveAll(...)delete(...)deleteAll(...)方法时都会触发领域事件。

在Spring Data发布domain event可以有两种实现方式:

  1. 继承AbstractAggregateRoot,并使用其registerEvent()方法注册发布事件
  2. 使用@DomainEvents注解方法发布事件

如:

@Entity
@Table(name = "person")
public class Person {
 @Id
 @GeneratedValue
 private Long id;
 private String name;
 private Integer gender;//1:male;2:female

 @DomainEvents
 Collection<Person> domainEvents() {
 return Lists.newArrayList(this);
 }

 @AfterDomainEventPublication
 void callbackMethod() {
 //
 }
}

@Entity
@Table(name = "person")
public class Person extends AbstractAggregateRoot{
 @Id
 @GeneratedValue
 private Long id;
 private String name;
 private Integer gender;//1:male;2:female

 public Person afterPersonSavedCompleted(){
 registerEvent(this);
 return this;
 }
}

监听事件处理

@Component
public class GenderStatProcessor {
 @Autowired
 GenderRepository genderRepository;

 @Async
 @TransactionalEventListener(phase=TransactionPhase.BEFORE_COMMIT)
 public void handleAfterPersonSavedComplete(Person event){

 GenderStat genderStat = genderRepository.findOne(1l);
 if(event.getGender()==1){
 genderStat.setMaleCount(genderStat.getMaleCount()+1);
 }else {
 genderStat.setFemaleCount(genderStat.getFemaleCount()+1);
 }
 genderRepository.save(genderStat);
 }
}

二、领域驱动设计概念

领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法,旨在通过将业务领域的核心概念融入软件设计中来解决复杂性问题。该方法强调将业务领域的核心概念和业务逻辑作为软件设计的重点,以便更好地满足业务需求。以下是领域驱动设计的一些关键概念和原则:

  1. 领域:领域是定义您要解决的问题的逻辑区域。例如,零售业务可能有库存领域、采购领域、人力资源领域、财务领域等。

  2. 有界上下文:有界上下文是围绕表示该领域解决方案的代码的逻辑边界。有界上下文可以根据团队组织、应用程序特定部分的使用以及代码库和数据库架构来定义。

  3. 通用语言:领域驱动设计强调使用通用语言,即开发人员和用户需要使用相同的语言来定义类名、模块、变量等。这样,代码读起来就好像用户在说话一样。

  4. 实体:实体是由唯一标识符唯一定义的领域对象,而不是由其属性定义。它们是领域建模的基本组成部分,应该是开始放置领域逻辑的地方。

  5. 值对象:值对象是不可更改的对象,具有属性,但没有独特的标识。例如,名称、地址、工作标题等可以是值对象。

  6. 聚合:聚合将实体和值对象聚合在一起,并围绕每个聚合定义边界。每个聚合有一个根实体,并且外部对象只能引用根实体。

  7. 工厂:工厂用于创建复杂对象和聚合,确保客户端不了解对象操作的内部细节和功能。

  8. 领域事件:领域事件用于记录与系统内模型活动相关的离散事件。它们应该涉及领域业务专家关心的事件,例如创建新客户等。

  9. 服务:当领域中存在重要的过程或转换时,将其作为独立接口声明为服务。

  10. 仓储:仓储是使用全局接口提供对聚合根的访问的服务,简化数据基础设施。

领域驱动设计的目标是通过将核心领域概念融入软件设计中,使软件更好地反映业务需求,从而降低复杂性并提高开发效率。

相关文章

网友评论

      本文标题:Spring Data JPA @DomainEvents发布领

      本文链接:https://www.haomeiwen.com/subject/beshndtx.html