ok,今天不知道看啥来着,突然想起来spring内部的事件通知的实现,其实比较简单,简要记一下。然后又回顾了下eventbus的实现,其实俩者的实现方式大同小异吧,只是spring的很多操作都可以直接基于底层的ioc容器,可以带来一部分的便利性。

事件通知无非是listener的注册,还有事件的分发俩部分。

listener的注册嘛,比较简单,在spring里的操作只是简单的把listener对象放到了map里,然后把retriver的cache清空。retriver的cache的作用是存放event类型和它对应的listener的映射关系,方便在分发事件的时候,直接找到这个event类型的订阅者。

在eventbus里的话,对这个新的listener做了一些分析吧,比如哪个方法来接收事件,接收的事件的类型是什么,然后把这个映射关系直接存起来。

事件分发的话,流程也基本是固定的,找到这个事件类型的订阅者,然后挨个通知就好了。在spring里的话,如果retriver的cache里没有的话,会对listener重新进行解析,再把这个关系建立起来。在eventbus里就直接用了,不需要再建立这个映射关系。

eventbus里在分发事件的时候,设置了一个queue来做缓冲队列,作用是什么,不是很理解。。。

我刚看了下,其实是比较疑惑的,这个eventsToDispatch这个queue貌似没有必要啊,就算不通过这个queue也是线程安全的。加了这个queue反而需要用ThreadLocal来保证线程安全性。。。

spring-事件通知实现的更多相关文章

  1. spring事件通知机制详解

    优势 解耦 对同一种事件有多种处理方式 不干扰主线(main line) 起源 要讲spring的事件通知机制,就要先了解一下spring中的这些接口和抽象类: ApplicationEventPub ...

  2. Spring事件通知机制

    在上图中,调用 getApplicationEventMulticaster()方法,该方法返回的ApplicationEventMulticaster类型的对象applicationEventMul ...

  3. spring发布和接收定制的事件(spring事件传播)

    spring发布和接收定制的事件(spring事件传播) 2012-12-26 20:05 22111人阅读 评论(2) 收藏 举报  分类: 开源技术(如Struts/spring/Hibernat ...

  4. Spring 事件

    JDK事件 java通过java.util.EventObject类和java.util.EventListener接口描述事件和监听器 事件源,事件的产生者,任何一个EventObject都必须拥有 ...

  5. spring事件机制

    前置知识补充: 程序里面所谓的“上下文”就是程序的执行环境,打个比方:你就相当于web程序,你的房子就相当于web程序的上下文,你可以在家里放东西,也可以取东西,你的衣食住行都依赖这个房子,这个房子就 ...

  6. spring发布和接收定制的事件(spring事件传播)[转]

    有事件,即有事件监听器. 有人问你spring监听器有哪些你看了下文即也知道了.   事件传播 ApplicationContext基于Observer模式(java.util包中有对应实现),提供了 ...

  7. Spring事件机制详解

    一.前言 说来惭愧,对应Spring事件机制之前只知道实现 ApplicationListener 接口,就可以基于Spring自带的事件做一些事情(如ContextRefreshedEvent),但 ...

  8. 从spring源码汲取营养:模仿spring事件发布机制,解耦业务代码

    前言 最近在项目中做了一项优化,对业务代码进行解耦.我们部门做的是警用系统,通俗的说,可理解为110报警.一条警情,会先后经过接警员.处警调度员.一线警员,警情是需要记录每一步的日志,是要可追溯的,比 ...

  9. Redis事件通知示例

    1. redis如同zk一样,提供了事件监听(或者说是回调机制), 下面是redis的配置说明: ############################# EVENT NOTIFICATION ## ...

  10. springcloud Eureka设置服务下线上线事件通知

    最近由于微服务会莫名其妙挂掉,导致一些服务宕机: 固所以寻找解决办法,莫名宕机暂时还未查明原因,先人肉解决办法 Eureka的server端会发出5个事件通知,分别是: EurekaInstanceC ...

随机推荐

  1. c# txt内存映射技术总结

    对于大文件操作,readline 的方式读取文档,那操作起来跟蜗牛爬一样的慢了, 于是使用内存映射技术, 参考微软的这个使用方法说明 https://msdn.microsoft.com/zh-cn/ ...

  2. C# 一段通用的写log 日志的好程序

    public void Write(string text) { FileStream fs = new FileStream(Application.StartupPath+"/log.t ...

  3. Architecture.SOLID-Principles

    SOLID Principles Reference 1. Single Responsibility http://en.wikipedia.org/wiki/Single_responsibili ...

  4. DEDE 首页调用指定栏目链接的代码

    {dede:type typeid='6'} <a href='[field:typelink /]' target="_blank" >更多</a> {/ ...

  5. 补课:Shell命令${}

    Shell中的${}.##和%%使用范例: 代码如下:file=/dir1/dir2/dir3/my.file.txt可以用${ }分别替换得到不同的值:${file#*/}:删掉第一个 / 及其左边 ...

  6. Trapping Rain Water LT42

    The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of ...

  7. 各种编译不通过xcode

    2017-08-24 Apple Mach-O Linker (Id) Error Linker command failed with exit code 1 (use -v to see invo ...

  8. sqlserver 数据分发复制 发布订阅

    转载地址:https://www.cnblogs.com/lizejia/p/6062674.html

  9. linux文件系统问题:wrong fs type, bad option, bad superblock

    http://blog.itpub.net/26006637/viewspace-1059946/ 报错内容: mount: wrong fs type, bad option, bad superb ...

  10. rails gem更换ruby-china源

    查看gem源 gem sources -l 换添加源 gem sources --add https://gems.ruby-china.com/ 删除原来的rubygems源 gem sources ...