转载

聊聊事件驱动模型

今天简单回顾下事件驱动模型。

什么是事件驱动模型

事件驱动模型,也即是我们通常说的观察者。基于发布-订阅模式的编程模型。定义对象间的一种一对多的依赖关,当一个对象的状态发生变化时,所有依赖它的对象都得到通知并自动更新。

事件驱动模型的应用

回顾想想平常自己接触到的事件驱动模型。

  1. 设计模式里面的观察者模式

  2. JDK观察者模式

  3. Java GUI事件驱动

  4. JavaBean事件驱动

  5. spring事件驱动

  6. ......

JavaBean规范提供了一种监听属性变化的事件驱动模型,提供操作JavaBean属性的类PropertyChangeSupport和PropertyEditorSupport。

spring事件驱动的话,可能你平常也会接触到。比如说订单状态变化的时候,能够通知到邮件服务,短信服务,积分变化等等; 如果你是个新手,想象一下你去实现这个业务的代码怎么去实现?接下来对spring事件驱动这块回顾下。

spring事件驱动

回到上面的问题,一般新人写这块代码,一个UserService里面引入积分Service,短信Service,邮件Service,还有很多很多Service,可能还要调用第3方接口,是不是发现问题所在了。Service耦合严重,代码不方便维护。

那利用spring事件驱动怎么去做呢?

增加了一个Listener来解耦UserService和其他服务,即注册成功后,只需要通知相关的监听器,不需要关系它们如何处理。增删功能非常容易。

这就是一个典型的事件处理模型/观察者,解耦目标对象和它的依赖对象,目标只需要通知它的依赖对象,具体怎么处理,依赖对象自己决定。比如是异步还是同步,延迟还是非延迟等。

上边其实也使用了DIP(依赖倒置原则),依赖于抽象,而不是具体。

回顾一下spring提供的事件驱动模型体系图:

聊聊事件驱动模型

  1. ApplicationEvent 事件,你要处理的事件都是来集成它。

  2. ApplicationEventPublisher发布事件者,比如上面你要操作积分,短信啥的,都是这个来触发的。

  3. 注意到有个ApplicationEventMulticaster,这是事件广播,因为事件发布,可以同步,异步等,有很多策略,所以需要Multicaster去封装扩展,统一让它履行协调发送的职责。

  4. ApplicationListener监听器,  发布事件肯定需要接收的地方,监听器在一启动的时候,加载到内存,当发布事件,找到对应Listener去接收事件处理业务逻辑;注意到有个Smart监听器,主要是做了顺序优先级等一些扩展。

具体更多想了解的,感兴趣的话可以去看看spring这块源码。

最后提一句:最近在写业务平台组件框架,里面涉及到事件驱动模块。顺带就把这个轻量级事件驱动框架azeroth-event开源了,接下来会做一次优化重构。大家感兴趣的可以点击原文链接去看看。

原文  https://mp.weixin.qq.com/s?__biz=MjM5NjA3MTQ4OA==&mid=2651715939&idx=1&sn=9d75066bb13fc1a9a59b6c1ebd3e466f&chksm=bd17884c8a60015a5bfe809ccdf497b6e819bd770f3b013eb5c42925d7445ff4ceac43938347&token=874714225&lang=zh_CN
正文到此结束
Loading...