响应式网站的制作,东莞模板网页制作,书签制作手工,秦皇岛市教育局1.一个Demo出发
在平时的开发中#xff0c;其实编写同步线程代码是比较容易的#xff0c;但是如何将一些操作和另外一些操作进行解除耦合#xff0c;而事件方式 是一种很好的解耦合方式#xff0c;比如当一个用户注销一个APP之后#xff0c;需要发送一些短信 让他引流回来…1.一个Demo出发
在平时的开发中其实编写同步线程代码是比较容易的但是如何将一些操作和另外一些操作进行解除耦合而事件方式 是一种很好的解耦合方式比如当一个用户注销一个APP之后需要发送一些短信 让他引流回来。
核心流程 其实就是 1.定义一个事件 2.事件发布器 3.事件监听器
1.1 定义一个事件
public class UserCloseEvent extends ApplicationEvent {private static final long serialVersionUID 1L;private String msg ;public UserCloseEvent(Object source, String msg) {super(source);this.msg msg;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg msg;}
}1.2 发布事件
Component
public class MyTestEventPubLisher {Autowiredprivate ApplicationEventPublisher applicationEventPublisher;public void pushUserCloseListener(String msg) {applicationEventPublisher.publishEvent(new UserCloseEvent(this, msg));}
}1.3 监听器 EventListenerpublic void listening3 (UserCloseEvent event) {System.out.println(注解监听器UserCloseEvent-发送了一个注销用户的召回申请WAevent.getClass().getName());}我们来分析一下 整体的原理首先定义一个事件这就是一个普通的对象第二个就是发布事件以及事件监听器是怎么感知到 要执行动作。 了解了这个流程之后就可以很清楚的明白整体的原理。
2. Spring原理流程解析
熟悉Spring源码 bean生命周期的应该都知道 preInstantiateSingletons 方法一共是两个对bean的操作第一部分其实就是实例化、初始化 bean的过程第二部分针对的是实现了 实现了 SmartInitializingSingleton 的子类的初始化方法。
2.1 EventListener 注册为bean的过程 和事件相关的实现类就是图中的 EventListenerMethodProcessor 可以看到实现了该接口
public class EventListenerMethodProcessor implements SmartInitializingSingleton, xxx {好了梳理下具体的过程 其实就是在所有bean进行初始化完成之后然后在针对注解做解析工作封装成Listener。
2.2 事件触发的流程 这里其实就是根据执行的类型和listener进行匹配如果是就开始顺序执行当然也可以使用线程池异步执行。因为前面已经封装了带有注解的方法的信息所以最终会通过反射的方式执行方法。 3 造轮子的EventBus
其实针对Guava的EventBus 核心流程 1.定义注解类 Subscribe 2.针对提供一个事件控制类EventBus 内部持有 ObserverRegistry 提供一个根据注册和执行事件的方法。主要存储一个mapkey是事件类型value是一个COW set对应的就是封装的ObserverAction(Class,method) 主要用于后续的反射执行方法。 总结
其实对于一个框架来说提供的功能是否易用非常重要并且不能和业务代码进行强耦合。所以虽然我们平时的工作是针对CRUD但是总有一些非业务功能开发比如一些基础架构的工作监控、耗时、日志等一些通用功能一定要使用非侵入业务的方式AOP就是一种方式当然各个框架也一般提供一定的预留拓展点来实现不同的功能。