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);
}

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

 

posted @ 2018-10-16 10:07  最爱五仁月饼  阅读(200)  评论(0编辑  收藏  举报