generic ApplicationListener event type gets detected through proxy as well
This commit is contained in:
parent
d2f28ccf41
commit
0fb4af6b59
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
package org.springframework.context.event;
|
package org.springframework.context.event;
|
||||||
|
|
||||||
|
import org.springframework.aop.support.AopUtils;
|
||||||
import org.springframework.context.ApplicationEvent;
|
import org.springframework.context.ApplicationEvent;
|
||||||
import org.springframework.context.ApplicationListener;
|
import org.springframework.context.ApplicationListener;
|
||||||
import org.springframework.core.GenericTypeResolver;
|
import org.springframework.core.GenericTypeResolver;
|
||||||
|
|
@ -52,6 +53,12 @@ public class GenericApplicationListenerAdapter implements SmartApplicationListen
|
||||||
|
|
||||||
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
|
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
|
||||||
Class typeArg = GenericTypeResolver.resolveTypeArgument(this.delegate.getClass(), ApplicationListener.class);
|
Class typeArg = GenericTypeResolver.resolveTypeArgument(this.delegate.getClass(), ApplicationListener.class);
|
||||||
|
if (typeArg == null || typeArg.equals(ApplicationEvent.class)) {
|
||||||
|
Class targetClass = AopUtils.getTargetClass(this.delegate);
|
||||||
|
if (targetClass != this.delegate.getClass()) {
|
||||||
|
typeArg = GenericTypeResolver.resolveTypeArgument(targetClass, ApplicationListener.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
return (typeArg == null || typeArg.isAssignableFrom(eventType));
|
return (typeArg == null || typeArg.isAssignableFrom(eventType));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ import static org.easymock.EasyMock.*;
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.springframework.aop.framework.ProxyFactory;
|
||||||
import org.springframework.beans.TestBean;
|
import org.springframework.beans.TestBean;
|
||||||
import org.springframework.beans.factory.config.RuntimeBeanReference;
|
import org.springframework.beans.factory.config.RuntimeBeanReference;
|
||||||
import org.springframework.beans.factory.support.RootBeanDefinition;
|
import org.springframework.beans.factory.support.RootBeanDefinition;
|
||||||
|
|
@ -71,6 +72,21 @@ public class ApplicationContextEventTests {
|
||||||
smc.multicastEvent(new MyOtherEvent(this));
|
smc.multicastEvent(new MyOtherEvent(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void proxiedListeners() {
|
||||||
|
MyOrderedListener1 listener1 = new MyOrderedListener1();
|
||||||
|
MyOrderedListener2 listener2 = new MyOrderedListener2(listener1);
|
||||||
|
ApplicationListener proxy1 = (ApplicationListener) new ProxyFactory(listener1).getProxy();
|
||||||
|
ApplicationListener proxy2 = (ApplicationListener) new ProxyFactory(listener2).getProxy();
|
||||||
|
|
||||||
|
SimpleApplicationEventMulticaster smc = new SimpleApplicationEventMulticaster();
|
||||||
|
smc.addApplicationListener(proxy1);
|
||||||
|
smc.addApplicationListener(proxy2);
|
||||||
|
|
||||||
|
smc.multicastEvent(new MyEvent(this));
|
||||||
|
smc.multicastEvent(new MyOtherEvent(this));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEventPublicationInterceptor() throws Throwable {
|
public void testEventPublicationInterceptor() throws Throwable {
|
||||||
MethodInvocation invocation = EasyMock.createMock(MethodInvocation.class);
|
MethodInvocation invocation = EasyMock.createMock(MethodInvocation.class);
|
||||||
|
|
|
||||||
|
|
@ -147,7 +147,11 @@ public abstract class GenericTypeResolver {
|
||||||
for (int i = 0; i < typeArgs.length; i++) {
|
for (int i = 0; i < typeArgs.length; i++) {
|
||||||
Type arg = typeArgs[i];
|
Type arg = typeArgs[i];
|
||||||
if (arg instanceof TypeVariable) {
|
if (arg instanceof TypeVariable) {
|
||||||
arg = getTypeVariableMap(ownerClass).get((TypeVariable) arg);
|
TypeVariable tv = (TypeVariable) arg;
|
||||||
|
arg = getTypeVariableMap(ownerClass).get(tv);
|
||||||
|
if (arg == null) {
|
||||||
|
arg = extractBoundForTypeVariable(tv);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
result[i] = (arg instanceof Class ? (Class) arg : Object.class);
|
result[i] = (arg instanceof Class ? (Class) arg : Object.class);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue