Spring event 和 Guava event

原创
2017/04/05 16:50
阅读数 916

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

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

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

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就是根据传入的类找到对应的方法执行。

 

 

展开阅读全文
打赏
0
3 收藏
分享
加载中
更多评论
打赏
0 评论
3 收藏
0
分享
返回顶部
顶部