Browse Source

Order ApplicationListener using @Order

AnnotationListener implementations can now be ordered either using the
`@Order` annotation or by implementing the Ordered interface.

Issue: SPR-12410
pull/739/head
Stephane Nicoll 10 years ago
parent
commit
8eb7beebc8
  1. 6
      spring-context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java
  2. 41
      spring-context/src/test/java/org/springframework/context/event/ApplicationContextEventTests.java

6
spring-context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java

@ -30,8 +30,8 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException; @@ -30,8 +30,8 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.OrderComparator;
import org.springframework.core.ResolvableType;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.util.ClassUtils;
import org.springframework.util.ObjectUtils;
@ -234,7 +234,7 @@ public abstract class AbstractApplicationEventMulticaster @@ -234,7 +234,7 @@ public abstract class AbstractApplicationEventMulticaster
}
}
}
OrderComparator.sort(allListeners);
AnnotationAwareOrderComparator.sort(allListeners);
return allListeners;
}
@ -349,7 +349,7 @@ public abstract class AbstractApplicationEventMulticaster @@ -349,7 +349,7 @@ public abstract class AbstractApplicationEventMulticaster
}
}
}
OrderComparator.sort(allListeners);
AnnotationAwareOrderComparator.sort(allListeners);
return allListeners;
}
}

41
spring-context/src/test/java/org/springframework/context/event/ApplicationContextEventTests.java

@ -35,6 +35,7 @@ import org.springframework.context.support.AbstractApplicationContext; @@ -35,6 +35,7 @@ import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.StaticApplicationContext;
import org.springframework.core.Ordered;
import org.springframework.core.ResolvableType;
import org.springframework.core.annotation.Order;
import org.springframework.scheduling.support.TaskUtils;
import org.springframework.tests.sample.beans.TestBean;
@ -168,6 +169,19 @@ public class ApplicationContextEventTests extends AbstractApplicationEventListen @@ -168,6 +169,19 @@ public class ApplicationContextEventTests extends AbstractApplicationEventListen
smc.multicastEvent(new MyOtherEvent(this));
}
@Test
public void orderedListenersWithAnnotation() {
MyOrderedListener3 listener1 = new MyOrderedListener3();
MyOrderedListener4 listener2 = new MyOrderedListener4(listener1);
SimpleApplicationEventMulticaster smc = new SimpleApplicationEventMulticaster();
smc.addApplicationListener(listener2);
smc.addApplicationListener(listener1);
smc.multicastEvent(new MyEvent(this));
smc.multicastEvent(new MyOtherEvent(this));
}
@Test
@SuppressWarnings("unchecked")
public void proxiedListeners() {
@ -396,4 +410,31 @@ public class ApplicationContextEventTests extends AbstractApplicationEventListen @@ -396,4 +410,31 @@ public class ApplicationContextEventTests extends AbstractApplicationEventListen
}
}
@Order(5)
public static class MyOrderedListener3 implements ApplicationListener<ApplicationEvent> {
public final Set<ApplicationEvent> seenEvents = new HashSet<ApplicationEvent>();
@Override
public void onApplicationEvent(ApplicationEvent event) {
this.seenEvents.add(event);
}
}
@Order(50)
public static class MyOrderedListener4 implements ApplicationListener<MyEvent> {
private final MyOrderedListener3 otherListener;
public MyOrderedListener4(MyOrderedListener3 otherListener) {
this.otherListener = otherListener;
}
@Override
public void onApplicationEvent(MyEvent event) {
assertTrue(otherListener.seenEvents.contains(event));
}
}
}

Loading…
Cancel
Save