Ordered stream access on ObjectProvider with strong order guarantees

Issue: SPR-17272
This commit is contained in:
Juergen Hoeller
2018-09-14 23:56:25 +02:00
parent 12240c7524
commit 41d4cb5cbf
6 changed files with 92 additions and 71 deletions

View File

@@ -1289,15 +1289,13 @@ public class AutowiredAnnotationBeanPostProcessorTests {
@Test
public void testObjectProviderInjectionWithTargetPrimary() {
bf.setDependencyComparator(Comparators.comparable());
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ObjectProviderInjectionBean.class));
RootBeanDefinition tb1 = new RootBeanDefinition(TestBean.class);
tb1.getPropertyValues().add("name", "yours");
RootBeanDefinition tb1 = new RootBeanDefinition(OrderedTestBean.class);
tb1.getPropertyValues().add("order", 1);
tb1.setPrimary(true);
bf.registerBeanDefinition("testBean1", tb1);
RootBeanDefinition tb2 = new RootBeanDefinition(TestBean.class);
tb2.getPropertyValues().add("name", "mine");
RootBeanDefinition tb2 = new RootBeanDefinition(OrderedTestBean.class);
tb2.getPropertyValues().add("order", 0);
tb2.setLazyInit(true);
bf.registerBeanDefinition("testBean2", tb2);
@@ -2885,7 +2883,7 @@ public class AutowiredAnnotationBeanPostProcessorTests {
}
public List<TestBean> sortedTestBeans() {
return this.testBeanProvider.toList();
return this.testBeanProvider.orderedStream().collect(Collectors.toList());
}
}
@@ -2983,6 +2981,21 @@ public class AutowiredAnnotationBeanPostProcessorTests {
}
public static class OrderedTestBean extends TestBean implements Ordered {
private int order;
public void setOrder(int order) {
this.order = order;
}
@Override
public int getOrder() {
return this.order;
}
}
public static class OrderedNestedTestBean extends NestedTestBean implements Ordered {
private int order;

View File

@@ -43,6 +43,7 @@ import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.config.TypedStringValue;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.beans.propertyeditors.CustomNumberEditor;
import org.springframework.core.Ordered;
import org.springframework.core.OverridingClassLoader;
import org.springframework.core.ResolvableType;
import org.springframework.core.io.ClassPathResource;
@@ -53,7 +54,6 @@ import org.springframework.tests.sample.beans.GenericBean;
import org.springframework.tests.sample.beans.GenericIntegerBean;
import org.springframework.tests.sample.beans.GenericSetOfIntegerBean;
import org.springframework.tests.sample.beans.TestBean;
import org.springframework.util.comparator.Comparators;
import static org.junit.Assert.*;
@@ -847,7 +847,6 @@ public class BeanFactoryGenericsTests {
public void testGenericMatchingWithFullTypeDifferentiation() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
bf.setAutowireCandidateResolver(new GenericTypeAwareAutowireCandidateResolver());
bf.setDependencyComparator(Comparators.comparable());
bf.registerBeanDefinition("store1", new RootBeanDefinition(DoubleStore.class));
bf.registerBeanDefinition("store2", new RootBeanDefinition(FloatStore.class));
@@ -907,7 +906,7 @@ public class BeanFactoryGenericsTests {
assertSame(bf.getBean("store1"), resolved.get(0));
assertSame(bf.getBean("store2"), resolved.get(1));
resolved = numberStoreProvider.toList();
resolved = numberStoreProvider.orderedStream().collect(Collectors.toList());
assertEquals(2, resolved.size());
assertSame(bf.getBean("store2"), resolved.get(0));
assertSame(bf.getBean("store1"), resolved.get(1));
@@ -923,7 +922,7 @@ public class BeanFactoryGenericsTests {
assertEquals(1, resolved.size());
assertTrue(resolved.contains(bf.getBean("store1")));
resolved = (List) doubleStoreProvider.toList();
resolved = (List) doubleStoreProvider.orderedStream().collect(Collectors.toList());
assertEquals(1, resolved.size());
assertTrue(resolved.contains(bf.getBean("store1")));
@@ -938,7 +937,7 @@ public class BeanFactoryGenericsTests {
assertEquals(1, resolved.size());
assertTrue(resolved.contains(bf.getBean("store2")));
resolved = (List) floatStoreProvider.toList();
resolved = (List) floatStoreProvider.orderedStream().collect(Collectors.toList());
assertEquals(1, resolved.size());
assertTrue(resolved.contains(bf.getBean("store2")));
}
@@ -1006,20 +1005,25 @@ public class BeanFactoryGenericsTests {
}
public static class NumberStore<T extends Number> implements Comparable<NumberStore> {
public static class NumberStore<T extends Number> {
}
public static class DoubleStore extends NumberStore<Double> implements Ordered {
@Override
public int compareTo(NumberStore other) {
return getClass().getName().compareTo(other.getClass().getName()) * -1;
public int getOrder() {
return 1;
}
}
public static class DoubleStore extends NumberStore<Double> {
}
public static class FloatStore extends NumberStore<Float> implements Ordered {
public static class FloatStore extends NumberStore<Float> {
@Override
public int getOrder() {
return 0;
}
}