1.DDD与Spring Data
DDD: domain-driven design(领域驱动设计)是复杂需求下软件开发的实现方式。有时间我将专门来讲解一下DDD。
Spring Data在很多地方都是按照DDD原则进行的设计(如Repository), 这里Spring Data主要是实现了DDD的aggregate
和domain event
:
-
aggregate
:一系列可以看成单一单元的领域对象的组合。如订单(order)和购物清单(line-items)都是单独的对象,但是将他们当成一个独立的单元(aggregate)。每个aggregate都有一个aggregate root
,任何和外部交互应该只能通过aggregate root
,这样aggregate root
就可以确保aggregate
的完整性。一个aggregate
内部具有事务(数据一致性)边界。 -
domain event
:aggregate
之间为了保证数据的一致性,使用事件驱动架构(Event-Driven Architecture)
来实现数据的最终一致性(Eventual consistency)
。而这些事件是通过aggregate root
发布的domain events
。
下面我们演示一个当Person
这个aggregate root
保存成功后,通过Person
的gender
属性对统计实体GenderStat
更新男女性别的统计数量。
格式化地址与源码下载:http://www.wisely.top/2017/06/20/spring-data-domain-event-usage/
2.演示
2.1 Person Aggregate Root
Person
作为Aggregate Root具备发布domain event的能力,在Spring Data 下可以有两种实现方式:
– 继承AbstractAggregateRoot
,并使用其registerEvent()
方法注册发布事件
– 使用@DomainEvents
注解方法发布事件
如:
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString(exclude = "domainEvents")
public class Person {
@Id
@GeneratedValue
private Long id;
private String name;
private Integer gender;//1:male;2:female
@DomainEvents
Collection<Object> domainEvents() {
List<Object> events= new ArrayList<Object>();
events.add(new PersonSavedEvent(this.id,this.gender));
return events;
}
@AfterDomainEventPublication
void callbackMethod() {
//
}
}
或
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString(exclude = "domainEvents")
public class Person extends AbstractAggregateRoot{
@Id
@GeneratedValue
private Long id;
private String name;
private Integer gender;//1:male;2:female
public Person afterPersonSavedCompleted(){
registerEvent(new PersonSavedEvent(this.id,this.gender));
return this;
}
}
2.2 监听事件处理
@Component
public class GenderStatProcessor {
@Autowired
GenderRepository genderRepository;
@Async
@TransactionalEventListener
public void handleAfterPersonSavedComplete(PersonSavedEvent event){
GenderStat genderStat = genderRepository.findOne(1l);
if(event.getGender()==1){
genderStat.setMaleCount(genderStat.getMaleCount()+1);
}else {
genderStat.setFemaleCount(genderStat.getFemaleCount()+1);
}
genderRepository.save(genderStat);
}
}
相关推荐
主要介绍了Spring Data的Domain Event的用法详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Spring Data MongoDB API。 Spring Data MongoDB 开发文档。
Spring Data JPA API。 Spring Data JPA 开发文档。 官网 Spring Data JPA API。
4. 尚硅谷_SpringData_Repository查询方法定义规范 5. 尚硅谷_SpringData_Query注解 6. 尚硅谷_SpringData_Modifying注解 7. 尚硅谷_SpringData_CrudRepository接口 8. 尚硅谷_SpringData_...
本次课程以SpringData为中心,重点讲解了其JPA组件,扩展讲解了redis,mongDB,ES组件,并且对部分组件做了必要的源码分析。而且在课程的最后部分加入了一个综合案例,可以将前面章节所学知识点应用到一个项目中,帮助...
'SpringDataJPA从入门到精通'以SpringBoot为技术基础 从入门到精通 由浅入深地介绍SpringDataJPA的使用。有语法 有实践 有原理剖析。'SpringDataJPA从入门到精通'分为12章 内容包括整体认识JPA、JPA基础查询方法、...
本文档详细介绍了Spring data JPA的概念、Spring Data JPA能够做什么,Services和 Repositories的对比以及各种Repositories的使用方法。
Spring Data JPA中文文档1.4.3
spring-data-jest, Jest的Spring Data 实现 Spring Data Jest 基于on客户端的ElasticSearch的Spring Data 实现仅在 HTTP ( 例如AWS上) 可以访问的情况下使用 Spring Data 和ElasticSearch群集。
1. The Spring Data Project 2. Repositories: Convenient Data Access Layers 3. Type-Safe Querying Using Querydsl . . Part II. Relational Databases 4. JPA Repositories 5. Type-Safe JDBC Programming with ...
采用目前主流的微服务系统架构 SpringBoot+SpringCloud+SpringData进行开发,前端技术采用Vue.js 。系统整体分为 三大部分:微服务、网站前台、网站管理后台。功能模块包括文章、问答、招聘、活 动、吐槽、交友、...
Spring Data MongoDB中文文档 便宜下载了。
很详细的springdata学习视频,介绍了springdata最常用的使用方法
spring注解完整版+spring data jpa官方文档中文翻译+JPA2.0官方文档 文档内容齐全 值得参考学习
Spring Data Envers API(Spring Data Envers 开发文档).CHM 官网 Spring Data Envers API
spring data jpa最新版本1.8.0,包含了spring-data-jpa-1.8.0.RELEASE.jar,spring-data-jpa-1.8.0.RELEASE-javadoc.jar以及 spring-data-jpa-1.8.0.RELEASE-sources.jar文档和源代码
赠送jar包:spring-data-commons-2.0.6.RELEASE....使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
该案例使用SpringBoot 整合了SPringData JPA,使用SpringData 开发简化了Dao层的开发量,简化了数据访问,使得持久化更加简单 !
Spring Data LDAP API。 Spring Data LDAP 开发文档。 官网 Spring Data LDAP API。
Spring Data Elasticsearch API(Spring Data Elasticsearch 开发文档).CHM。 官网 Spring Data Elasticsearch API