Move getListenerId method to Smart/GenericApplicationListener
See gh-26638
This commit is contained in:
@@ -18,7 +18,6 @@ package org.springframework.context;
|
||||
|
||||
import java.util.EventListener;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
/**
|
||||
* Interface to be implemented by application event listeners.
|
||||
@@ -36,6 +35,8 @@ import java.util.function.Predicate;
|
||||
* @param <E> the specific {@code ApplicationEvent} subclass to listen to
|
||||
* @see org.springframework.context.ApplicationEvent
|
||||
* @see org.springframework.context.event.ApplicationEventMulticaster
|
||||
* @see org.springframework.context.event.SmartApplicationListener
|
||||
* @see org.springframework.context.event.GenericApplicationListener
|
||||
* @see org.springframework.context.event.EventListener
|
||||
*/
|
||||
@FunctionalInterface
|
||||
@@ -47,17 +48,6 @@ public interface ApplicationListener<E extends ApplicationEvent> extends EventLi
|
||||
*/
|
||||
void onApplicationEvent(E event);
|
||||
|
||||
/**
|
||||
* Return an optional identifier for the listener.
|
||||
* <p>The default value is an empty String.
|
||||
* @since 5.3.5
|
||||
* @see org.springframework.context.event.EventListener#id
|
||||
* @see org.springframework.context.event.ApplicationEventMulticaster#removeApplicationListeners(Predicate)
|
||||
*/
|
||||
default String getListenerId() {
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a new {@code ApplicationListener} for the given payload consumer.
|
||||
|
||||
@@ -78,7 +78,7 @@ public interface ApplicationEventMulticaster {
|
||||
* <p>Note: This just applies to instance registrations, not to listeners
|
||||
* registered by bean name.
|
||||
* @param predicate the predicate to identify listener instances to remove,
|
||||
* e.g. checking {@link ApplicationListener#getListenerId()}
|
||||
* e.g. checking {@link SmartApplicationListener#getListenerId()}
|
||||
* @since 5.3.5
|
||||
* @see #addApplicationListener(ApplicationListener)
|
||||
* @see #removeApplicationListener(ApplicationListener)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
* Copyright 2002-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -18,9 +18,7 @@ package org.springframework.context.event;
|
||||
|
||||
import org.springframework.context.ApplicationEvent;
|
||||
import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.core.ResolvableType;
|
||||
import org.springframework.lang.Nullable;
|
||||
|
||||
/**
|
||||
* Extended variant of the standard {@link ApplicationListener} interface,
|
||||
@@ -28,13 +26,26 @@ import org.springframework.lang.Nullable;
|
||||
*
|
||||
* <p>As of Spring Framework 4.2, this interface supersedes the Class-based
|
||||
* {@link SmartApplicationListener} with full handling of generic event types.
|
||||
* As of 5.3.5, it formally extends {@link SmartApplicationListener}, adapting
|
||||
* {@link #supportsEventType(Class)} to {@link #supportsEventType(ResolvableType)}
|
||||
* with a default method.
|
||||
*
|
||||
* @author Stephane Nicoll
|
||||
* @author Juergen Hoeller
|
||||
* @since 4.2
|
||||
* @see SmartApplicationListener
|
||||
* @see GenericApplicationListenerAdapter
|
||||
*/
|
||||
public interface GenericApplicationListener extends ApplicationListener<ApplicationEvent>, Ordered {
|
||||
public interface GenericApplicationListener extends SmartApplicationListener {
|
||||
|
||||
/**
|
||||
* Overrides {@link SmartApplicationListener#supportsEventType(Class)} with
|
||||
* delegation to {@link #supportsEventType(ResolvableType)}.
|
||||
*/
|
||||
@Override
|
||||
default boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
|
||||
return supportsEventType(ResolvableType.forClass(eventType));
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether this listener actually supports the given event type.
|
||||
@@ -42,22 +53,4 @@ public interface GenericApplicationListener extends ApplicationListener<Applicat
|
||||
*/
|
||||
boolean supportsEventType(ResolvableType eventType);
|
||||
|
||||
/**
|
||||
* Determine whether this listener actually supports the given source type.
|
||||
* <p>The default implementation always returns {@code true}.
|
||||
* @param sourceType the source type, or {@code null} if no source
|
||||
*/
|
||||
default boolean supportsSourceType(@Nullable Class<?> sourceType) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine this listener's order in a set of listeners for the same event.
|
||||
* <p>The default implementation returns {@link #LOWEST_PRECEDENCE}.
|
||||
*/
|
||||
@Override
|
||||
default int getOrder() {
|
||||
return LOWEST_PRECEDENCE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ import org.springframework.util.ConcurrentReferenceHashMap;
|
||||
* @since 3.0
|
||||
* @see org.springframework.context.ApplicationListener#onApplicationEvent
|
||||
*/
|
||||
public class GenericApplicationListenerAdapter implements GenericApplicationListener, SmartApplicationListener {
|
||||
public class GenericApplicationListenerAdapter implements GenericApplicationListener {
|
||||
|
||||
private static final Map<Class<?>, ResolvableType> eventTypeCache = new ConcurrentReferenceHashMap<>();
|
||||
|
||||
@@ -64,15 +64,13 @@ public class GenericApplicationListenerAdapter implements GenericApplicationList
|
||||
this.delegate.onApplicationEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getListenerId() {
|
||||
return this.delegate.getListenerId();
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public boolean supportsEventType(ResolvableType eventType) {
|
||||
if (this.delegate instanceof SmartApplicationListener) {
|
||||
if (this.delegate instanceof GenericApplicationListener) {
|
||||
return ((GenericApplicationListener) this.delegate).supportsEventType(eventType);
|
||||
}
|
||||
else if (this.delegate instanceof SmartApplicationListener) {
|
||||
Class<? extends ApplicationEvent> eventClass = (Class<? extends ApplicationEvent>) eventType.resolve();
|
||||
return (eventClass != null && ((SmartApplicationListener) this.delegate).supportsEventType(eventClass));
|
||||
}
|
||||
@@ -81,11 +79,6 @@ public class GenericApplicationListenerAdapter implements GenericApplicationList
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
|
||||
return supportsEventType(ResolvableType.forClass(eventType));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsSourceType(@Nullable Class<?> sourceType) {
|
||||
return !(this.delegate instanceof SmartApplicationListener) ||
|
||||
@@ -97,6 +90,12 @@ public class GenericApplicationListenerAdapter implements GenericApplicationList
|
||||
return (this.delegate instanceof Ordered ? ((Ordered) this.delegate).getOrder() : Ordered.LOWEST_PRECEDENCE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getListenerId() {
|
||||
return (this.delegate instanceof SmartApplicationListener ?
|
||||
((SmartApplicationListener) this.delegate).getListenerId() : "");
|
||||
}
|
||||
|
||||
|
||||
@Nullable
|
||||
private static ResolvableType resolveDeclaredEventType(ApplicationListener<ApplicationEvent> listener) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
* Copyright 2002-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -59,4 +59,15 @@ public interface SmartApplicationListener extends ApplicationListener<Applicatio
|
||||
return LOWEST_PRECEDENCE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an optional identifier for the listener.
|
||||
* <p>The default value is an empty String.
|
||||
* @since 5.3.5
|
||||
* @see EventListener#id
|
||||
* @see ApplicationEventMulticaster#removeApplicationListeners
|
||||
*/
|
||||
default String getListenerId() {
|
||||
return "";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ import org.springframework.lang.Nullable;
|
||||
* @author Stephane Nicoll
|
||||
* @since 2.0.5
|
||||
*/
|
||||
public class SourceFilteringListener implements GenericApplicationListener, SmartApplicationListener {
|
||||
public class SourceFilteringListener implements GenericApplicationListener {
|
||||
|
||||
private final Object source;
|
||||
|
||||
@@ -74,21 +74,11 @@ public class SourceFilteringListener implements GenericApplicationListener, Smar
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getListenerId() {
|
||||
return (this.delegate != null ? this.delegate.getListenerId() : "");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsEventType(ResolvableType eventType) {
|
||||
return (this.delegate == null || this.delegate.supportsEventType(eventType));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
|
||||
return supportsEventType(ResolvableType.forType(eventType));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsSourceType(@Nullable Class<?> sourceType) {
|
||||
return (sourceType != null && sourceType.isInstance(this.source));
|
||||
@@ -99,6 +89,11 @@ public class SourceFilteringListener implements GenericApplicationListener, Smar
|
||||
return (this.delegate != null ? this.delegate.getOrder() : Ordered.LOWEST_PRECEDENCE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getListenerId() {
|
||||
return (this.delegate != null ? this.delegate.getListenerId() : "");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Actually process the event, after having filtered according to the
|
||||
|
||||
Reference in New Issue
Block a user