栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java DDD中event机制的应用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java DDD中event机制的应用

概述:最近一直在搞Java-DDD模式开发的方案落地;

个人的理解,DDD模式中,只要关注三个模块即可:

A. application:应用层,可以是http接口服务,也可以是grpc服务接口,甚至是rpc服务;

B. domain:领域层,主要是领域业务的具体实现,跟上层的应用没有任何关系;

C. infrastructure:基础服务层,包括项目中的持久化之类的代码;

那么,如何将这三层进行较好的解耦,各式其责,在这里想到了java的事件机制!

看了一些解决方案,没有达到自己的预期,

0.1 要么太重了,比如MQ服务;

0.2 要么,还是侵入式太强,比如spring的事件机制;

0.3 java原生的事件机制,支持的也不好,自己封装,又太费时;

最终,选定 ​​​​​JFinal-event 作为事件机制进行使用,简单,轻量,又解决了紧耦合问题!

具体细节:JFinal-event: JFinal-event事件驱动插件,无任何第三方依赖,小巧玲珑。

下面开始应用(基于spring boot):

1. 添加maven依赖:

        
            net.dreamlu
            JFinal-event
            3.1.2
        
        
        
            com.jfinal
            jfinal
            5.0.0
        

注意:下方的jfinal依赖要加上,不然会报 jfinal.log找不到的问题,这一点不是太好!

2. 配置 EventPlugin,在项目合适的位置:

import net.dreamlu.event.EventPlugin;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class EventConfig {

    @Bean
    public EventPlugin createEventPlugin() {
        EventPlugin plugin = new EventPlugin();
        // 设置为异步,默认同步,或者使用`threadPool(ExecutorService executorService)`自定义线程池。
        plugin.async();
        // 开启类扫描,默认为 false,用于不支持注解处理器的情况,用于不使用 maven 或者不支持注解处理器的情况。
        plugin.enableClassScan();
        // 扫描 jar 里的 监听器,默认不扫描,在开启 enableClassScan 有效果
        plugin.scanJar();
        // 扫描的包,默认全扫描,可提升启动速度,在开启 enableClassScan 有效果,多个路径,用;
        plugin.scanPackage("com.*.event;com.*.*.event");
        //手动启动插件,用于main方法启动,jfinal中不需要,添加插件即可。
        plugin.start();
        return plugin;
    }

}

3. 创建事件类,继承 ApplicationEvent,例如:

public class AdSaveEvent extends ApplicationEvent {

    private static final long serialVersionUID = 1L;

    public AdSaveEvent(String source) {
        super(source);
    }

}

4. 触发事件:我这里测试在领域层触发保存业务:

public void testEvent(){
   EventKit.post(new AdSaveEvent("Hello"));
}

5. 添加事件监听:核心注解:@EventListener,这个业务下面还可以加入多个listener

public class AdEventListener {

    @EventListener
    public void adSave(AdSaveEvent adSaveEvent) {
        String source = adSaveEvent.getSource();
        //保存广告业务
        System.out.println("我监听到 " + source + " 要保存广告了!");
    }
}

测试最美结果:

这样子,我们就能将各个层级进行解耦,每个模块子负责关心自己的业务逻辑即可,互不侵扰!

你的努力,终将成为你最有力的资本!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/930139.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号