在spring框架中用spring data commons 1.13版本实现DDD

本文介绍了Spring Data Commons 1.13版本中新增的抽象聚合根类,该类支持领域事件模型的实现。通过继承此抽象类,可以轻松地在领域模型中注册并发布领域事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在最新的spring data commons 1.13框架中,新增了一个抽象聚合根类,我们可以继承这个聚合根类来完成领域事件模型。

说明:使你的领域层以来spring data commons在我眼里并不代表领域模型依赖了某一项特定的技术,spring data commons应该是一个通用的接口;因为底层你可以使用spring data jpa或spring data mongodb甚至于spring data redis等来实现具体的持久化任务。

下面我们来看一下新版的commons框架中增加的一个抽象聚合根类:

https://github.com/spring-projects/spring-data-commons/blob/master/src/main/java/org/springframework/data/domain/AbstractAggregateRoot.java

public class AbstractAggregateRoot {

	/**
	 * 这会在lombok自动生成的getDomainEvents()方法上加上@DomainEvents注解,只有这个注册的domain事件或事件集合才会被扫描到事件总线去发布
	 */
	@Getter(onMethod = @__(@DomainEvents)) //
	private transient final List<Object> domainEvents = new ArrayList<Object>();

	/**
	 * Registers the given event object for publication on a call to a Spring Data repository's save method.
	 * 
	 * @param event must not be {@literal null}.
	 * @return
	 */
	protected <T> T registerEvent(T event) {

		Assert.notNull(event, "Domain event must not be null!");

		this.domainEvents.add(event);
		return event;
	}

	/**
	 * Clears all domain events currently held. Usually invoked by the infrastructure in place in Spring Data
	 * repositories.
	 */
	@AfterDomainEventPublication
	public void clearDomainEvents() {
		this.domainEvents.clear();
	}
}

写一个自己的领域模型,比如订单类Order来继承这个AbstractAggregateRoot ,其中订单的其他属性(结构特征)我们先不考虑,因为这不是这篇文章的重点,我们只考虑它的业务方法。

public class Order extends AbstractAggregateRoot {

	Order complete() {
		registerEvent(new OrderCompletedEvent(this));
		return this;
	}
}

 它有一个订单完成的业务方法,你可以注册一个或者多个完成订单时需要发布的事件,我们在这个complete方法中注册订单完成的领域事件,这个注册的事件会在你调用repository中的save()方法时触发,然后发布到事件总线。

执行仓储的save()时触发事件的代码见commons框架中的EventPublishingRepositoryProxyPostProcessor文件

org.springframework.data.repository.core.support.EventPublishingRepositoryProxyPostProcessor

现在你就可以对你的领域事件OrderCompletedEvent 进行建模,记录订单业务的发起事件、发起用户等等,我这里只是做个例子,具体根据业务场景而定。

public class OrderCompletedEvent {

	private Order order;

	@CreatedBy
	private User user;

	@CreatedDate
	private Date createdDate;

	public OrderCompletedEvent(Order order) {
		this.order = order;
	}

}

 

转载于:https://my.oschina.net/buwei/blog/837511

注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值