zoukankan      html  css  js  c++  java
  • 023 事件机制

    一 .概述

      本次说明一下事件机制的内容.


     二 .基本概念

    [1]事件对象  

    public abstract class ApplicationEvent extends EventObject 

    上面的内容就是最为基本的容器事件,这是一个抽象类,如果我们需要定义自己的事件的时候,一般会选择继承该类.

    我们看看,在spring之中的实现类.

    其中就有我们最为常用的ContextRefreshedEvent,当容器刷新完成之后,就会发布这个事件.

    [2]事件发布

      下面的这个接口描述的就是事件发布者的接口,我们能看到其中最为重要的就是发布事件的方法.

    public interface ApplicationEventPublisher {
    
       //通知在容器之中所有监听该事件类型的监听器,这些事件可能是容器事件,也可能也是我们的自定义的事件.
    void publishEvent(ApplicationEvent event); // 发布一个事件,如果event的类型不是一个ApplicationContext,那么spring会帮你封装为PayloadApplicationEvent对象
       void publishEvent(Object event); }

    一般情况下,我们都会定义一个ApplicationEvent类型,也就是会调用第一个方法.

    public interface ApplicationEventMulticaster {
      void addApplicationListener(ApplicationListener<?> listener);
      void addApplicationListenerBean(String listenerBeanName);
      void removeApplicationListener(ApplicationListener<?> listener);
      void removeApplicationListenerBean(String listenerBeanName);
      void removeAllListeners();
      void multicastEvent(ApplicationEvent event);
       void multicastEvent(ApplicationEvent event, ResolvableType eventType);
    
    }

    上面的接口描述的就是个事件监听器的集合概念,我们可以添加删除一个事件监听器,然后可以发布事件.

    public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
            MessageSource, ApplicationEventPublisher, ResourcePatternResolver {

    我们看到我们的IOC容器本身就是一个事件的发布者,也就是说,我们可以使用IOC容器来发布一个事件,那么这个事件会被IOC容器之中的监听器所监听.

    [3]事件监听对象

      首先看一下核心的接口:

    public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
    
        void onApplicationEvent(E event);
    
    }

    一个实现了该接口的对象就是一个事件的监听器,它可以处理对应泛型类型的事件.


    三.异步执行  

    <!-- 开启@AspectJ AOP代理 -->  
    <aop:aspectj-autoproxy proxy-target-class="true"/>  
      
    <!-- 任务调度器 -->  
    <task:scheduler id="scheduler" pool-size="10"/>  
      
    <!-- 任务执行器 -->  
    <task:executor id="executor" pool-size="10"/>  
      
    <!--开启注解调度支持 @Async @Scheduled-->  
    <task:annotation-driven executor="executor" scheduler="scheduler" proxy-target-class="true"/>

    现在我们一般情况下直接使用异步注解来完成:  

    public @interface EnableAsync {

    我们首先在我们的环境下启动异步支持,然后再异步的方法上面添加@Async注解保持异步驱动.


    四 .使用@EventListener完成事件的监听  

    @EventListener(condition = "#blogModifiedEvent.importantChange")
    public void blogModifiedSpEL(BlogModifiedEvent blogModifiedEvent) {
        externalNotificationSender.blogModifiedSpEL(blogModifiedEvent);
    }

    我们可以使用这种比较简单的事件的监听策略来完成.

  • 相关阅读:
    webpack
    localStorage使用总结
    html5 的localstorage
    js 的登录验证
    webpack vue2.0项目脚手架生成的webpack文件
    vue2.0 keep-alive最佳实践
    npm 的指令介绍
    vue2.0 子组件和父组件之间的传值
    electron的通信
    electron 的窗口设置最大化 最小化
  • 原文地址:https://www.cnblogs.com/trekxu/p/9796357.html
Copyright © 2011-2022 走看看