Spring事件机制

总结:

事件广播器ApplicationEventMulticaster中维护者所有的监听器ApplicationListener,当事件发布器ApplicationEventPublisher发布一个事件ApplicationEvent到事件广播器中,事件广播器会遍历所有符合事件类型的事件监听器,对事件进行消费监听;

默认事项发布是一个同步的操作,也可以设置为异步。查看@同步异步

职能分划

a、ApplicationListener:事件监听器
ApplicationListener是观察者,可以通过实现接口或者注解来自定义观察者,ApplicationListener会感受到某种状态变化。ApplicationListener 继承自 JDK 的 EventListener ,JDK 要求所有监听者继承它。监听者只有一个方法 onApplicationEvent,用来处理事件 ApplicationEvent。
项目中我们自己自定义观察者(监听者)对象;

@Component
public class ProjectEventListener implements ApplicationListener<WLkEvent> {

  

    @Override
    public void onApplicationEvent(WLkEvent wLkEvent) {
        eventsProcess(wLkEvent);
    }
}

b、ApplicationEvent:事件
ApplicationEvent是事件对象,是事件传达到介质。在事件中,被观察者可以认为是发出事件到那一方,只有在状态变化时才发布事件。ApplicationEvent是一个抽象类,继承类EventObject类
项目中我们自定义事项对象

public class WLkEvent extends ApplicationEvent{

    private static final long serialVersionUID = 6701614314920216157L;
    private String sourceId;
    public WLkEvent (Object source,Long sourceId) {
        super(source);
        this.sourceId=sourceId;
    }
}

c、ApplicationEventPublisher:事件发布器
通过publishEvent发布一个事件,spring通过广播把事件传递给所有到观察者。调用观察者到onApplicationEvent()把事件对象传递给观察者。所有的容器对象基本都实现了ApplicationEventPublisher
在这里插入图片描述
项目中将事项发布出去:

 @Autowired
    private ApplicationContext applicationContext;
    
//发布事件
//ApplicationEventPublisher会将事件发布给事件广播器ApplicationEventMulticaster,事件广播器里保存着所有的事件监听器,依次让符合事件类型的事项监听器对事件进行监听
        applicationContext.publishEvent(new WLkEvent (applicationContext,id));

d、ApplicationEventMulticaster:事件广播器
框架提供了 ApplicationEventMulticaster 接口的默认实现 SimpleApplicationEventMulticaster,如果本地容器中没有 ApplicationEventMulticaster 的实现就会使用这个默认实现。

//可以通过观察者添加/移除/发布,也可以通过观察者名称,通过名称可以在容器中拿到观察者对实体,
public interface ApplicationEventMulticaster {
    //增加观察者
    void addApplicationListener(ApplicationListener<?> var1);
    void addApplicationListenerBean(String var1);
    //移除观察者
    void removeApplicationListener(ApplicationListener<?> var1);
    void removeApplicationListenerBean(String var1);
    void removeAllListeners();
    //发布观察者
    void multicastEvent(ApplicationEvent var1);
    void multicastEvent(ApplicationEvent var1, ResolvableType var2);
}

在 SimpleApplicationEventMulticaster 中,可以看到 multicastEvent 方法中遍历了所有的 Listener,并依次调用 Listener 的 onApplicationEvent 方法发布事件。@同步异步:Spring 还提供了异步发布事件的能力,taskExecutor 不为 null 时即异步执行。

public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster {
    @Nullable
    private Executor taskExecutor;
    public void setTaskExecutor(Executor taskExecutor) { this.taskExecutor = taskExecutor;}
    protected Executor getTaskExecutor() {return this.taskExecutor;}
    //...
    //发布观察者
    @Override
    public void multicastEvent(final ApplicationEvent event, ResolvableType eventType) {
        ResolvableType type = eventType != null ? 
            eventType : 
            this.resolveDefaultEventType(event);
        //拿到所有event来源并且eventType类型对观察者
        Iterator var4 = this.getApplicationListeners(event, type).iterator();
        while(var4.hasNext()) {
            //获取当前观察者
            final ApplicationListener<?> listener = (ApplicationListener)var4.next();
            Executor executor = this.getTaskExecutor();
            //taskExecutor不为null时,执行异步发布事件
            if (executor != null) {
                executor.execute(new Runnable() {
                    public void run() {
                        SimpleApplicationEventMulticaster.this.invokeListener(listener, event);
                    }
                });
            } else {
                this.invokeListener(listener, event);
            }
        }
    }
    
    //检查错误处理类
    protected void invokeListener(ApplicationListener<?> listener, ApplicationEvent event) {
        ErrorHandler errorHandler = this.getErrorHandler();
        //错误处理类不为空时,捕获执行异常,有异常时执行处理类对自定义方法
        if (errorHandler != null) {
            try {
                this.doInvokeListener(listener, event);
            } catch (Throwable var5) {
                errorHandler.handleError(var5);
            }
        } else {
            this.doInvokeListener(listener, event);
        }

    }
    
    //执行观察者onApplicationEvent方法
    private void doInvokeListener(ApplicationListener listener, ApplicationEvent event) {
		try {
			listener.onApplicationEvent(event);
		}
		catch (ClassCastException ex) {
			//省略类异常处理
		}
	}
    //...
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值