一、@DomainEvents
@DomainEvents
是 Spring Data 的注解之一,用于发布领域事件。
领域事件是指反映系统内部状态更改的事件。该注解通常用于聚合根类,它从聚合根中收集要发布的事件,并在事务成功提交后发布这些事件。
通俗地讲, 每个Entity类都可以作为聚合根类Aggregate Root, 并具备发布domain event的能力, 即每次调用Spring Data Repository 的save(...)
、saveAll(...)
、delete(...)
或deleteAll(...)
方法时都会触发领域事件。
在Spring Data发布domain event可以有两种实现方式:
- 继承AbstractAggregateRoot,并使用其registerEvent()方法注册发布事件
- 使用@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)是一种软件开发方法,旨在通过将业务领域的核心概念融入软件设计中来解决复杂性问题。该方法强调将业务领域的核心概念和业务逻辑作为软件设计的重点,以便更好地满足业务需求。以下是领域驱动设计的一些关键概念和原则:
-
领域:领域是定义您要解决的问题的逻辑区域。例如,零售业务可能有库存领域、采购领域、人力资源领域、财务领域等。
-
有界上下文:有界上下文是围绕表示该领域解决方案的代码的逻辑边界。有界上下文可以根据团队组织、应用程序特定部分的使用以及代码库和数据库架构来定义。
-
通用语言:领域驱动设计强调使用通用语言,即开发人员和用户需要使用相同的语言来定义类名、模块、变量等。这样,代码读起来就好像用户在说话一样。
-
实体:实体是由唯一标识符唯一定义的领域对象,而不是由其属性定义。它们是领域建模的基本组成部分,应该是开始放置领域逻辑的地方。
-
值对象:值对象是不可更改的对象,具有属性,但没有独特的标识。例如,名称、地址、工作标题等可以是值对象。
-
聚合:聚合将实体和值对象聚合在一起,并围绕每个聚合定义边界。每个聚合有一个根实体,并且外部对象只能引用根实体。
-
工厂:工厂用于创建复杂对象和聚合,确保客户端不了解对象操作的内部细节和功能。
-
领域事件:领域事件用于记录与系统内模型活动相关的离散事件。它们应该涉及领域业务专家关心的事件,例如创建新客户等。
-
服务:当领域中存在重要的过程或转换时,将其作为独立接口声明为服务。
-
仓储:仓储是使用全局接口提供对聚合根的访问的服务,简化数据基础设施。
领域驱动设计的目标是通过将核心领域概念融入软件设计中,使软件更好地反映业务需求,从而降低复杂性并提高开发效率。
网友评论