Polishing
This commit is contained in:
@@ -81,6 +81,7 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe
|
||||
|
||||
private EventListener eventListener;
|
||||
|
||||
|
||||
public ApplicationListenerMethodAdapter(String beanName, Class<?> targetClass, Method method) {
|
||||
this.beanName = beanName;
|
||||
this.method = method;
|
||||
@@ -90,6 +91,7 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe
|
||||
this.methodKey = new AnnotatedElementKey(this.method, this.targetClass);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initialize this instance.
|
||||
*/
|
||||
@@ -98,11 +100,40 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe
|
||||
this.evaluator = evaluator;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onApplicationEvent(ApplicationEvent event) {
|
||||
processEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsEventType(ResolvableType eventType) {
|
||||
for (ResolvableType declaredEventType : this.declaredEventTypes) {
|
||||
if (declaredEventType.isAssignableFrom(eventType)) {
|
||||
return true;
|
||||
}
|
||||
else if (PayloadApplicationEvent.class.isAssignableFrom(eventType.getRawClass())) {
|
||||
ResolvableType payloadType = eventType.as(PayloadApplicationEvent.class).getGeneric();
|
||||
if (declaredEventType.isAssignableFrom(payloadType)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return eventType.hasUnresolvableGenerics();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsSourceType(Class<?> sourceType) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
Order order = getMethodAnnotation(Order.class);
|
||||
return (order != null ? order.value() : 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Process the specified {@link ApplicationEvent}, checking if the condition
|
||||
* match and handling non-null result, if any.
|
||||
@@ -144,7 +175,6 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe
|
||||
}
|
||||
|
||||
protected void handleResult(Object result) {
|
||||
Assert.notNull(this.applicationContext, "ApplicationContext must no be null.");
|
||||
if (result.getClass().isArray()) {
|
||||
Object[] events = ObjectUtils.toObjectArray(result);
|
||||
for (Object event : events) {
|
||||
@@ -164,6 +194,7 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe
|
||||
|
||||
private void publishEvent(Object event) {
|
||||
if (event != null) {
|
||||
Assert.notNull(this.applicationContext, "ApplicationContext must no be null");
|
||||
this.applicationContext.publishEvent(event);
|
||||
}
|
||||
}
|
||||
@@ -174,41 +205,14 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe
|
||||
}
|
||||
String condition = getCondition();
|
||||
if (StringUtils.hasText(condition)) {
|
||||
Assert.notNull(this.evaluator, "Evaluator must no be null.");
|
||||
EvaluationContext evaluationContext = this.evaluator.createEvaluationContext(event,
|
||||
this.targetClass, this.method, args);
|
||||
Assert.notNull(this.evaluator, "EventExpressionEvaluator must no be null");
|
||||
EvaluationContext evaluationContext = this.evaluator.createEvaluationContext(
|
||||
event, this.targetClass, this.method, args);
|
||||
return this.evaluator.condition(condition, this.methodKey, evaluationContext);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsEventType(ResolvableType eventType) {
|
||||
for (ResolvableType declaredEventType : this.declaredEventTypes) {
|
||||
if (declaredEventType.isAssignableFrom(eventType)) {
|
||||
return true;
|
||||
}
|
||||
else if (PayloadApplicationEvent.class.isAssignableFrom(eventType.getRawClass())) {
|
||||
ResolvableType payloadType = eventType.as(PayloadApplicationEvent.class).getGeneric();
|
||||
if (declaredEventType.isAssignableFrom(payloadType)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return eventType.hasUnresolvableGenerics();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsSourceType(Class<?> sourceType) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
Order order = getMethodAnnotation(Order.class);
|
||||
return (order != null ? order.value() : 0);
|
||||
}
|
||||
|
||||
protected <A extends Annotation> A getMethodAnnotation(Class<A> annotationType) {
|
||||
return AnnotationUtils.findAnnotation(this.method, annotationType);
|
||||
}
|
||||
@@ -246,7 +250,7 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe
|
||||
* Return the target bean instance to use.
|
||||
*/
|
||||
protected Object getTargetBean() {
|
||||
Assert.notNull(this.applicationContext, "ApplicationContext must no be null.");
|
||||
Assert.notNull(this.applicationContext, "ApplicationContext must no be null");
|
||||
return this.applicationContext.getBean(this.beanName);
|
||||
}
|
||||
|
||||
@@ -346,8 +350,8 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe
|
||||
private List<ResolvableType> resolveDeclaredEventTypes() {
|
||||
int count = this.method.getParameterTypes().length;
|
||||
if (count > 1) {
|
||||
throw new IllegalStateException("Maximum one parameter is allowed " +
|
||||
"for event listener method: " + method);
|
||||
throw new IllegalStateException(
|
||||
"Maximum one parameter is allowed for event listener method: " + this.method);
|
||||
}
|
||||
EventListener ann = getEventListener();
|
||||
if (ann != null && ann.classes().length > 0) {
|
||||
@@ -359,13 +363,14 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe
|
||||
}
|
||||
else {
|
||||
if (count == 0) {
|
||||
throw new IllegalStateException("Event parameter is mandatory " +
|
||||
"for event listener method: " + method);
|
||||
throw new IllegalStateException(
|
||||
"Event parameter is mandatory for event listener method: " + this.method);
|
||||
}
|
||||
return Collections.singletonList(ResolvableType.forMethodParameter(this.method, 0));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.method.toGenericString();
|
||||
|
||||
@@ -29,8 +29,8 @@ import org.springframework.core.annotation.AliasFor;
|
||||
* Annotation that marks a method as a listener for application events.
|
||||
*
|
||||
* <p>If an annotated method supports a single event type, the method may
|
||||
* declare a single parameter that reflects the event type to listen to. If
|
||||
* an annotated method supports multiple event types, this annotation may
|
||||
* declare a single parameter that reflects the event type to listen to.
|
||||
* If an annotated method supports multiple event types, this annotation may
|
||||
* refer to one or more supported event types using the {@code classes}
|
||||
* attribute. See {@link #classes} for further details.
|
||||
*
|
||||
@@ -42,20 +42,19 @@ import org.springframework.core.annotation.AliasFor;
|
||||
* when using Java config or manually via the {@code <context:annotation-driven/>}
|
||||
* element when using XML config.
|
||||
*
|
||||
* <p>Annotated methods may have a non-{@code void} return type. When they
|
||||
* do, the result of the method invocation is sent as a new event. If the
|
||||
* return type is either an array or a collection, each element is sent as
|
||||
* a new event.
|
||||
* <p>Annotated methods may have a non-{@code void} return type. When they do,
|
||||
* the result of the method invocation is sent as a new event. If the return type
|
||||
* is either an array or a collection, each element is sent as a new event.
|
||||
*
|
||||
* <p>It is also possible to define the order in which listeners for a
|
||||
* certain event are invoked. To do so, add a regular
|
||||
* <p>It is also possible to define the order in which listeners for a certain
|
||||
* event are invoked. To do so, add Spring's common
|
||||
* {@link org.springframework.core.annotation.Order @Order} annotation
|
||||
* alongside this annotation.
|
||||
*
|
||||
* <p>While it is possible for an event listener to declare that it throws
|
||||
* arbitrary exception types, any checked exceptions thrown from an event
|
||||
* listener will be wrapped in a {@link java.lang.reflect.UndeclaredThrowableException}
|
||||
* since the caller can only handle runtime exceptions.
|
||||
* <p>While it is possible for an event listener to declare that it throws arbitrary
|
||||
* exception types, any checked exceptions thrown from an event listener will be
|
||||
* wrapped in an {@link java.lang.reflect.UndeclaredThrowableException} since
|
||||
* the caller can only handle runtime exceptions.
|
||||
*
|
||||
* @author Stephane Nicoll
|
||||
* @since 4.2
|
||||
@@ -89,4 +88,4 @@ public @interface EventListener {
|
||||
*/
|
||||
String condition() default "";
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user