专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
芋道源码  ·  5.6K ... ·  15 小时前  
芋道源码  ·  为什么有些程序员上班时总是戴着耳机? ·  15 小时前  
芋道源码  ·  面试官:为什么数据库连接很消耗资源? ·  2 天前  
芋道源码  ·  我用这11招,让接口性能提升了100倍 ·  2 天前  
芋道源码  ·  2W字全面剖析 Mybatis 中的9种设计模式 ·  2 天前  
51好读  ›  专栏  ›  芋道源码

Spring Event + DDD = 王炸!!

芋道源码  · 公众号  · Java  · 2025-05-01 20:21

正文

请到「今天看啥」查看全文


  • 4.3. @EventListener + @Async
  • 4.4. @TransactionEventListener + @Async
  • 5. 小结

  • 1. 领域事件

    领域事件是 DDD 中重要的模式之一,主要用于模型或系统间的解耦,提高系统的可扩展性和可维护性。

    1.1. 什么是领域事件

    领域事件是领域驱动设计(Domain-Driven Design,简称DDD)中的一个重要概念,特指在领域模型中发生的有意义的事件,是对领域模型中的重要业务动作执行结果的抽象,如订单创建、支付完成等。

    在DDD中,领域事件是一种用于传递信息的机制,它使得不同领域模型之间的通信变得更加简单和灵活。通过将事件分发给相关的订阅者,可以让不同的领域模型之间实现松耦合,从而更容易扩展和维护应用程序。

    领域事件通常由领域对象主动触发并发布,而事件处理器则负责订阅事件并对事件进行处理。通过事件发布和订阅机制,可以在应用程序中实现高效的事件驱动架构,从而更好地支持复杂的业务逻辑和业务流程。

    说起来有点抽象,简单举个例子:假设有一个电子商务系统,用户下单后需要生成订单并发送通知给相关人员。在领域模型中,可以定义一个 Order 领域对象,该对象可以包含多个属性,如订单号、下单时间、购买的商品信息、收货地址等等。当用户下单时,可以通过调用 Order 对象的方法来生成订单,同时也可以通过领域事件来发送通知。

    具体来说,可以定义一个 OrderCreated 领域事件,用于表示订单创建完成的事件,该事件包含一些必要的属性,如订单号、下单时间、购买的商品信息、收货地址等等。当 Order 对象创建完成后,可以通过领域事件来触发发送通知的操作,比如发送邮件或短信通知相关人员。

    1.2. 领域事件的应用场景

    领域事件的应用创建众多,从图中可以看出:

    领域事件可以:

    • 保证聚合间的数据一致性。当一个聚合根上的操作引发了其他聚合根的变更时,将这些变更作为领域事件发布出去,其他聚合根可以订阅这些事件并更新自己的状态,从而实现最终一致性。
    • 替换批量处理。可以作为任务的触发器,例如定时任务、异步任务,避免定时+扫描这类批量处理。
    • 实现事件源模式。将所有的领域事件全部存储下来,可以用于恢复聚合的状态,实现事件源模式;也可以用于后续的审计和调试。
    • 进行限界上下文集成。将事件从一个子域发布到另一个子域,使得这两个子域可以解耦,不用相互知道彼此的存在。

    领域事件虽好,但仍需技术框架进行支持,其实 Spring 的 Event 机制就足以满足各类需求。

    基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

    • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
    • 视频教程:https://doc.iocoder.cn/video/

    2. Spring 对 Event 的支持

    在 Spring 中,事件的处理可以通过三种方式来实现:

    1. 基于接口的事件处理:通过实现 ApplicationListener 接口并重写 onApplicationEvent 方法来处理事件。
    2. 基于注解的事件处理:通过在方法上添加 @EventListener 或 @TransactionEventListener 注解来处理事件,可以指定事件的类型以及监听的条件等。
    3. 基于异步事件处理:通过使用 @Async 注解来异步处理事件,可以提高应用程序的响应速度。

    2.1. 基于接口的事件处理

    由于与 Spring 存在强耦合,现在已经很少使用,可以直接跳过。

    下面是一个基于接口的事件处理的示例代码:

    @Component
    public class MyEventListener implements ApplicationListener<MyEvent{
        @Override
        public void onApplicationEvent(MyEvent event) {
            // 处理事件
            System.out.println("Received event: " + event.getMessage());
        }
    }

    public class MyEvent {
        






    请到「今天看啥」查看全文