文档章节

Spring event 和 Guava event

陈二C
 陈二C
发布于 2017/04/05 16:50
字数 508
阅读 38
收藏 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就是根据传入的类找到对应的方法执行。

 

 

© 著作权归作者所有

共有 人打赏支持
陈二C
粉丝 5
博文 9
码字总数 15584
作品 0
杭州
为JFinal添加event消息事件

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

如梦技术
2015/04/28
0
20
guava eventbus源码解析

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

天河2018
07/07
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
Spring Event是什么鬼

一、什么是程序世界里的事件? 最常见的点击操作是一种事件,刷新操作是一种事件,类似的还有很多,在程序的世界里,事件的起源是输入设备的一个信号(比如中断响应),进而将事件(或者说信...

八月下沙
2016/03/31
153
0
Spring Boot Admin 2.0.2 发布,支持自定义 UI 视图

Spring Boot Admin 2.0.2 已发布,官方没有提供本次的更新说明,不过我们从关闭的 issue 中看到,该版本的更新内容主要是 bug 修复和功能增强。 列举部分如下: Add view for mappings endp...

局长
08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

配置Spring的注解支持

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 配置Spring的注解支持 以上也提到了使用注解来配...

凯哥学堂
33分钟前
0
0
关于Spring Aop存在的一点问题的思考

在本人前面的文章Spring Aop原理之切点表达式解析中讲解了Spring是如何解析切点表达式的,在分析源码的时候,出现了如下将要讲述的问题,我认为是不合理的,后来本人单纯使用aspectj进行试验...

爱宝贝丶
34分钟前
0
0
JavaScript 概述

JavaScript是面向Web的编程语言。绝大多数现代网站都使用了JavaScript,并且所有的现代Web浏览器——基于桌面系统、游戏机、平板电脑和智能手机的浏览器——均包含了JavaScript解释器。这使得...

Mr_ET
今天
0
0
Java Run-Time Data Areas(Java运行时数据区/内存分配)

Java运行时数据区(内存分配) 本文转载官网 更多相关内容可查看官网 中文翻译可参考 2.5. Run-Time Data Areas The Java Virtual Machine defines various run-time data areas that are use...

lichuangnk
今天
0
0
docker learn :services docker-compose.yml

docker-compose.yml定义了服务的运行参数 version: "3" services: web: # replace username/repo:tag with your name and image details image: hub.c.163.com/dog948453219/friendlyhello d......

writeademo
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部