Spring event 和 Guava event
博客专区 > 陈二C 的博客 > 博客详情
Spring event 和 Guava event
陈二C 发表于11个月前
Spring event 和 Guava event
  • 发表于 11个月前
  • 阅读 27
  • 收藏 3
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

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

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

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

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

 

 

标签: 源码解析
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 5
博文 9
码字总数 15476
×
陈二C
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: