java 事件机制原理 自定义事件发布与监听

通过自定义事件机制去理解 java和spring中的事件机制原理

① 自定义事件机制整体框架如下,base包中为事件核心类,event包为测试用的事件 demo包为测试类

② 首先我们定义一个通用事件源,记录事件信息,里面可以放事件通用的一些信息,我现在什么也没放

/**
 * 定义通用事件源,记录事件信息
 */
public class DIYEvent {

}

③ 然后我们定义通用事件监听器 只接受事件类型,里面定义我们事件监听是要处理的方法

/**
 * 定义通用事件监听器
 * @param <E>
 */
public interface DIYListener<E extends DIYEvent> {

    public void handler(E e);
}

④ 最后我们定义统一的事件管理,核心代码就在下面,里面有两个方法,一个是事件的发布,一个是事件的注册监听

/**
 * 定义统一的事件管理
 */
public class EventManage {

    //记录发布的事件和对该事件进行了监听的监听器
    private static Map<String,List<DIYListener>> map=new HashMap<>();


    /**
     * 注册监听
     * @param listener
     */
    public static void addListener(DIYListener listener){
        //获取泛型类
        Class arg = (Class)((ParameterizedType) listener.getClass().getGenericInterfaces()[0]).getActualTypeArguments()[0];
        String name=arg.getName();
        if(!map.containsKey(name)){
            map.put(name,new ArrayList<>());
        }
        map.get(name).add(listener);
    }

    /**
     * 发布事件
     * @param event
     */
    public static void publish(DIYEvent event){

        if(map.containsKey(event.getClass().getName())){
            List<DIYListener> list=map.get(event.getClass().getName());
            for (DIYListener listener:list) {
                listener.handler(event);
            }
        }
    }

}

⑤ 到上一步咋们的事件机制就已经定义完成了,现在咋们来测试一下,先定义一个事件A

/**
 * 定义A事件源
 */
public class AEvent extends DIYEvent {

    private String name;

    public AEvent(String name) {
        this.name = name;
    }

    public AEvent() {}

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

⑥ 再定义一个对A事件进行监听的A监听器,里面实现对A事件监听到时要处理的事情,我这边只做了打印

/**
 * 定义A 事件监听器
 */
public class AListener implements DIYListener<AEvent> {

    @Override
    public void handler(AEvent aEvent) {
        System.out.printf("A 事件 已处理 -name:"+aEvent.getName());
    }
}

⑦ 最后我们写个测试类来调用一下,先注册A事件的监听,再发布A事件

public class Test {
    public static void main(String[] args) {
        //注册A事件的监听
        EventManage.addListener(new AListener());

        //发布A事件
        EventManage.publish(new AEvent("A事件"));
    }
}

 ⑧ 查看测试结果,处理A事件中的日志已经被打印出来了,说明事件处理成功

com.yonyou.event.demo.Test
A 事件 已处理 -name:A事件
Process finished with exit code 0

⑨ 完结 撒花!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值