一 .概述
本次说明一下事件机制的内容.
二 .基本概念
[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); }
我们可以使用这种比较简单的事件的监听策略来完成.