`
wiselyman
  • 浏览: 2093133 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
博客专栏
Group-logo
点睛Spring4.1
浏览量:82271
74ae1471-94c5-3ae2-b227-779326b57435
点睛Spring MVC4...
浏览量:130757
社区版块
存档分类
最新评论

Spring Data的Domain Event的用法

 
阅读更多

1.DDD与Spring Data

DDD: domain-driven design(领域驱动设计)是复杂需求下软件开发的实现方式。有时间我将专门来讲解一下DDD。

Spring Data在很多地方都是按照DDD原则进行的设计(如Repository), 这里Spring Data主要是实现了DDD的aggregatedomain event:

  • aggregate:一系列可以看成单一单元的领域对象的组合。如订单(order)和购物清单(line-items)都是单独的对象,但是将他们当成一个独立的单元(aggregate)。每个aggregate都有一个aggregate root,任何和外部交互应该只能通过aggregate root,这样aggregate root就可以确保aggregate的完整性。一个aggregate内部具有事务(数据一致性)边界。

     

  • domain eventaggregate之间为了保证数据的一致性,使用事件驱动架构(Event-Driven Architecture)来实现数据的最终一致性(Eventual consistency)。而这些事件是通过aggregate root发布的domain events

下面我们演示一个当Person这个aggregate root 保存成功后,通过Persongender属性对统计实体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);
    }
}

 

0
1
分享到:
评论

相关推荐

    Spring Data的Domain Event的用法详解

    摘要:本文主要介绍了Spring Data的Domain Event的用法详解,通过对Domain Event的概念、aggregate的概念、Domain Event的发布和处理等方面的详细讲解,旨在帮助读者深入了解Spring Data Domain Event的使用方法和...

    详解基于Spring Data的领域事件发布

    例如,在下面的示例代码中,我们定义了一个 SaleOrder entity,一个 SaleOrderEvent 事件,并使用 @DomainEvents 注解来标注领域对象的事件发布方法。 ```java @Entity public class SaleOrder implements ...

    微服务+DDD代码结构例子-spring-microservice-ddd.zip

    6. **利用Spring Data JPA**:为了持久化领域模型,可以利用Spring Data JPA简化数据访问层的开发。它可以自动生成CRUD操作,并支持JPA的查询语言。 7. **事件驱动架构**:通过领域事件实现服务间的异步通信。例如...

    webSocket配置wss访问

    console.log('收到服务器消息:' + event.data); }; ``` 通过以上步骤,你已经成功配置了Spring Boot 2.1项目,实现了WebSocket服务并支持wss访问。现在,客户端可以通过安全的HTTPS连接与服务器进行实时通信,...

    DDD在Java框架的例子课程.zip

    - 如何使用Spring Data JPA创建Repository接口并实现数据访问。 - 如何在Java服务中应用领域驱动的设计模式,如领域事件和业务规则。 - 如何通过事件监听器或消息队列处理领域事件。 - 如何组织DDD项目的代码结构,...

    DDD精简版

    “工具”标签可能意味着讨论了使用特定的开发工具或框架来支持DDD实践,比如使用领域驱动建模工具进行建模,或者选择支持DDD的框架,如Spring Data JPA、Hibernate ORM等。 压缩包中的“DDD精简版.pdf”可能是一份...

    Mastering JBoss Drools 6 for Developers_And_SourceCode.zip

    You will be briefly introduced to the concept of complex event processing (Drools CEP) where you will learn how to aggregate and correlate your data based on temporal conditions. You will also learn ...

    DDD 微服务落地实战视频教程

    例如,使用Spring Data JPA处理持久化,利用RabbitMQ实现事件总线,以及Docker容器化部署等。 10. **持续集成与交付(CI/CD)**:对于微服务项目,高效的CI/CD流程至关重要。学习者将学习如何配置Jenkins、GitLab C...

    DDD分层架构参考代码目录结构

    DDD(Domain-Driven Design,领域驱动设计)是一种软件开发方法,强调以业务领域为中心进行系统设计。其分层架构模型是DDD的核心设计模式,它将系统分为用户接口层、应用层、领域层和基础层,旨在清晰界定各层职责,...

    DDD-BackEnd

    - **Spring框架**:作为Java企业级应用的基石,Spring Boot简化了初始化和配置过程,Spring Data支持领域模型的持久化,Spring Cloud为微服务架构提供工具集。 - **Java Persistence API (JPA)**:用于对象关系...

    cqrs-bench:在CQRS上工作

    在Java开发中,CQRS可以与事件溯源(Event Sourcing)和领域驱动设计(Domain-Driven Design, DDD)等模式结合使用,以构建高可扩展的微服务架构。CQRS的核心在于,读操作和写操作不再共享相同的数据库模型,而是...

    锻炼DDD

    【标题】:“锻炼DDD”指的是在实践中应用领域驱动设计(Domain-Driven Design,简称DDD)这一软件开发方法论。DDD是一种以业务领域为中心的设计思想,旨在通过深入理解业务逻辑,构建高质量、高内聚、低耦合的软件...

    DomainAssignment:为第三年的项目创建域的草稿

    6. **领域事件(Domain Event)**:当领域状态发生改变时,可以发布领域事件,其他组件可以通过监听这些事件来做出反应。这有助于实现松耦合的设计。 7. **Java框架应用**:为了高效地开发,可能会用到Spring框架,它...

    【2024电商新风向】微信小程序:打造你的掌上商城!

    - **后端技术**:采用Spring Boot框架结合Java实现API接口,确保前后端分离,提高系统的可维护性。 - **数据库**:使用MySQL存储数据,保证数据的安全性和一致性。 - **后台管理界面**:采用Layui作为Web后台管理...

Global site tag (gtag.js) - Google Analytics