通过自定义事件机制去理解 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
⑨ 完结 撒花!