深入理解Spring的容器内事件发布监听机制(9)

protected boolean supportsEvent(ApplicationListener<?> listener, ResolvableType eventType, Class<?> sourceType) {
        //对原始的ApplicationListener进行一层适配器包装成为GenericApplicationListener
        GenericApplicationListener smartListener = (listener instanceof GenericApplicationListener ?
                (GenericApplicationListener) listener : new GenericApplicationListenerAdapter(listener));
                //判断监听器是否支持该事件类型以及该事件源类型
        return (smartListener.supportsEventType(eventType) && smartListener.supportsSourceType(sourceType));
    }

首先对原始的ApplicationListener进行一层适配器包装成GenericApplicationListener,便于后面使用该接口中定义的方法判断监听器是否支持传入的事件类型或事件源类型

public interface GenericApplicationListener extends ApplicationListener<ApplicationEvent>, Ordered {

/**
    * Determine whether this listener actually supports the given event type.
    */
  boolean supportsEventType(ResolvableType eventType); //判断是否支持该事件类型

/**
    * Determine whether this listener actually supports the given source type.
    */
  boolean supportsSourceType(Class<?> sourceType);  //判断是否支持该事件源类型

}

smartListener.supportsEventType(eventType)用来判断监听器是否支持该事件类型,因为我们的监听器实例通常都不是SmartApplicationListener类型,所以直接看下面箭头所指的方法就好

深入理解Spring的容器内事件发布监听机制

declaredEventType是监听器泛型的实际类型,而eventType是发布的事件的类型
declaredEventType.isAssignableFrom(eventType)当以下两种情况返回true

1.declaredEventType和eventType类型相同

2.declaredEventType是eventType的父类型
只要监听器泛型的实际类型和发布的事件类型一样或是它的父类型,则该监听器将被成功匹配。

而对于事件源类型而言,通常默认会直接返回true,也就是说事件源的类型通常对于判断匹配的监听器没有意义。

深入理解Spring的容器内事件发布监听机制

这里查找到所有匹配的监听器返回后会将匹配关系缓存到retrieverCache这个map中

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8aa7eccef7a6ee573b4af64ab1388374.html