文档章节

Spring event 和 Guava event

陈二C
 陈二C
发布于 2017/04/05 16:50
字数 508
阅读 49
收藏 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
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
07/07
0
0
Spring Boot / Spring Cloud 项目中获取本项目端口号

这是Spring Boot 2.0.0 M1之前获取本项目端口的方法然而在Spring Boot 2.0.0 M1之后,EmbeddedServletContainerInitializedEvent已经改名我们参考https://github.com/spring-projects/spring......

Anur
09/13
0
0
《Spring Recipes》第二章笔记:event-based communication

《Spring Recipes》第二章笔记:event-based communication 问题 在bean之间添加事件驱动的通信。 解决方案 1、事件类需要继承ApplicationEvent。实现构造函数,在事件类中添加用于传递信息的...

LiJIaming
2012/05/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

根据进程名称杀死进程

ps -ef | grep keyword | grep -v grep | awk '{print $2}' | xargs kill -9 逐个分析: 1, ps -ef | grep keyword: 查出进程名含有 keyword 的所有进程; 2, grep -v grep: 从这些结果里面,把......

vinci321
32分钟前
1
0
nginx的简单使用:负载均衡

nginx:反向代理的服务器;用户发送请求到nginx,nginx把请求发送给真正的服务器,等待服务器处理完数据并返回,再把数据发送给用户。 nginx作为一个反向代理服务器,能缓存我们项目的静态文...

osliang
48分钟前
2
0
网站title标题被改并被百度网址安全中心提醒的解决办法

国庆假日期间我们Sine安全接到众多网站站长求助网站标题被改导致在百度搜索中百度安全中心提醒被拦截,导致网站正常用户无法浏览网站被跳转到一些菠菜du博网站,而且很明显的一个特征就是在百...

网站安全
50分钟前
1
0
JDK版本与major.minor version的对照关系

其实,只需要记住jdk6对于major.minor version 50即可,其他版本自行计算即可。 ---------------------

码代码的小司机
53分钟前
1
0
C++基础教程面向对象学习笔记及心得感悟[图]

C++基础教程面向对象学习笔记及心得感悟[图] 使用友元函数重载算术运算符: C ++中一些最常用的运算符是算术运算符 - 即加号运算符(+),减运算符( - ),乘法运算符(*)和除法运算符(/...

原创小博客
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部