文档章节

Spring event 和 Guava event

陈二C
 陈二C
发布于 2017/04/05 16:50
字数 508
阅读 79
收藏 3

  事件驱动是为了减少耦合,提高代码的复用。

  而事件驱动可以看做是观察者模式的实现。

  主题保存了一系列的观察者角色,当有状态改变将通知对应的观察者做出相对应的反应。

spring event

  我们先来看看demo

  1. 定义事件(需要继承ApplicationEvent)
    public class ContentEvent extends ApplicationEvent {  
        public ContentEvent(final String content) {  
            super(content);  
        }  
    }  
  2. 定义监听器(需要实现ApplicationListener)
    @Component  
    public class ContentListener implements ApplicationListener<ContentEvent> {  
        @Override  
        public void onApplicationEvent(final ContentEvent event) {  
            System.out.println("XXX" + event.getSource());  
        }  
    }  
  3. 触发事件

        @Autowired  
        private ApplicationContext applicationContext;  
       
        //   
        applicationContext.publishEvent(new ContentEvent("蛤蛤蛤"));  
         
    ​

    ——————————————————————————————————————————

  看完了上面的demo,大家可能就发现了这就是观察者模式的实现呀。我们来看看spring到底是怎么实做的,首先先看看ApplicationContext.publishEvent

protected void publishEvent(Object event, ResolvableType eventType) {
		........
		// Multicast right now if possible - or lazily once the multicaster is initialized
		if (this.earlyApplicationEvents != null) {
			this.earlyApplicationEvents.add(applicationEvent);
		}
		else {
            //最核心的部分,前面可以看到无论是否继承AppicationEvent,触发前都会包装成ApplicaitonEvent
            //看到这可以发现Spring是根据类来区分哪些观察者需要通知
            //在这可以大胆猜测getApplicationEventMulticaster()就是根据类的类型拿到交给Spring管理的观察者
            //(继承了ApplicationListener的类)
            //而实际上是Applicaiton在初始化的时候把继承ApplicationListener的类放进了属性
            //applicationEventMulticaster
            //getApplicationEventMulticaster()就是返回了这个属性
			getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);
		}

		
	}

 

Guava Event

  再来看看guava evnet的demo

  1. 定义事件
    public class Event {
        private final int message;
    
        public TestEvent(int message) {        
            this.message = message;
            System.out.println("event message:"+message);
        }
    
        public int getMessage() {
            return message;
        }
    }

     

  2. 定义监听器

    public class EventListener {
        public int lastMessage = 0;
    
        @Subscribe
        public void listen(Event event) {
            lastMessage = event.getMessage();
            System.out.println("Message:"+lastMessage);
        }
    
        public int getLastMessage() {      
            return lastMessage;
        }
    }
    

     

  3. 触发事件

            EventBus eventBus = new EventBus("test");
            EventListener listener = new EventListener();
            eventBus.register(listener);
            eventBus.post(new Event(200));
            System.out.println("LastMessage:"+listener.getLastMessage());

    ------------------------------------------------------------------------------------------------------------

  在以上中,可以看出在Guava Event比较重要的两个步骤,就是register和post,源码中register是根据是否有@Subscribe注解把方法放入以方法参数的类为key的map中,然后post就是根据传入的类找到对应的方法执行。

 

 

© 著作权归作者所有

共有 人打赏支持
下一篇: Socket与NIO
陈二C
粉丝 5
博文 9
码字总数 15584
作品 0
杭州
私信 提问
为JFinal添加event消息事件

在之前使用spring mvc的时候,在复杂的下单和支付中有一部分功能使用的Spring事件驱动模型去完成!具体优点不啰嗦了,发现涛哥有篇文章讲得比较详细:[详解Spring事件驱动模型][1] 最初准备基...

如梦技术
2015/04/28
0
20
Microserver v0.62 发布,Java 微服务框架

Microserver v0.62 发布,该版本改进如下: 一个新的插件架构和11个插件: micro-reactive - reactive programming via Pipes (Queues & Topics) and Asyncrhonous Streams. micro-events -......

oschina
2015/08/06
1K
3
SpringBoot | 第三十二章:事件的发布和监听

前言 今天去官网查看资料时,在特性中看见了章节。想想,的事件应该是在版本就发布的功能了,并越来越完善,其为和之间的消息通信提供了支持。比如,我们可以在用户注册成功后,发送一份注册...

oKong
2018/11/06
0
0
spring中的event listener模式和解耦

event,listener是observer模式一种体现,在spring 3.0.5中,已经可以使用annotation实现event和eventListner里。 我们以spring-webflow里的hotel booking为例,看一下实现,步骤如下: 1,建...

烀饼
2012/02/10
0
4
guava eventbus源码解析

说在前面 本文转自“天河聊技术”微信公众号 事件驱动模型设计是一种优雅的程序设计方式,实现有很多,原理都是发布与订阅,观察者设计模式实现,java自带的实现、spring ioc的事件驱动模型,...

天河2018
2018/07/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java 树形图构建

https://blog.csdn.net/massivestars/article/details/53911620/

kuchawyz
26分钟前
1
0
零基础如何学习大数据技术,大数据学习路线是什么?

在目前,当零基础学习大数据视频教程前,首先我们要学习Java语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 对于小白学习大数据需要注意的点有很多,但无论如何,既然...

董黎明
28分钟前
2
0
123

123

lifes77
28分钟前
0
0
MySQL游标

MySQL游标 While循环 -- MySQL游标只能用于存储过程和函数-- 使用过程 声明、打开游标、使用游标、关闭游标-- 如果未明确关闭游标,END时会自动关闭-- https://dev.mysql.com/doc/refman/...

yysue
29分钟前
1
0
互联网下半场的角逐,玩转轻资产的大数据服务 | 阿里云栖开发者沙龙大数据专场(北京站)干货集锦

2019年1月18日下午,一个晴冷的冬日,由阿里巴巴MaxCompute开发者社区和阿里云栖社区联合主办的“阿里云栖开发者沙龙大数据技术专场”走近北京联合大学。当日,近200名大数据开发者和爱好者现...

阿里云官方博客
31分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部