Browse Source

Test for mixed order across bean factory hierarchy

See gh-28374

(cherry picked from commit 48f3c08395)
pull/33657/head
Juergen Hoeller 2 years ago
parent
commit
f4ac323409
  1. 40
      spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java

40
spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java

@ -2102,7 +2102,7 @@ class DefaultListableBeanFactoryTests { @@ -2102,7 +2102,7 @@ class DefaultListableBeanFactoryTests {
}
@Test
void beanProviderWithParentBeanFactoryReuseOrder() {
void beanProviderWithParentBeanFactoryDetectsOrder() {
DefaultListableBeanFactory parentBf = new DefaultListableBeanFactory();
parentBf.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
parentBf.registerBeanDefinition("regular", new RootBeanDefinition(TestBean.class));
@ -2110,10 +2110,36 @@ class DefaultListableBeanFactoryTests { @@ -2110,10 +2110,36 @@ class DefaultListableBeanFactoryTests {
lbf.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
lbf.setParentBeanFactory(parentBf);
lbf.registerBeanDefinition("low", new RootBeanDefinition(LowPriorityTestBean.class));
Stream<Class<?>> orderedTypes = lbf.getBeanProvider(TestBean.class).orderedStream().map(Object::getClass);
assertThat(orderedTypes).containsExactly(HighPriorityTestBean.class, LowPriorityTestBean.class, TestBean.class);
}
@Test // gh-28374
void beanProviderWithParentBeanFactoryAndMixedOrder() {
DefaultListableBeanFactory parentBf = new DefaultListableBeanFactory();
parentBf.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
lbf.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
lbf.setParentBeanFactory(parentBf);
lbf.registerSingleton("plainTestBean", new TestBean());
RootBeanDefinition bd1 = new RootBeanDefinition(PriorityTestBeanFactory.class);
bd1.setFactoryMethodName("lowPriorityTestBean");
lbf.registerBeanDefinition("lowPriorityTestBean", bd1);
RootBeanDefinition bd2 = new RootBeanDefinition(PriorityTestBeanFactory.class);
bd2.setFactoryMethodName("highPriorityTestBean");
parentBf.registerBeanDefinition("highPriorityTestBean", bd2);
ObjectProvider<TestBean> testBeanProvider = lbf.getBeanProvider(ResolvableType.forClass(TestBean.class));
List<TestBean> resolved = testBeanProvider.orderedStream().toList();
assertThat(resolved.size()).isEqualTo(3);
assertThat(resolved.get(0)).isSameAs(lbf.getBean("highPriorityTestBean"));
assertThat(resolved.get(1)).isSameAs(lbf.getBean("lowPriorityTestBean"));
assertThat(resolved.get(2)).isSameAs(lbf.getBean("plainTestBean"));
}
@Test
void autowireExistingBeanByName() {
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
@ -3287,6 +3313,18 @@ class DefaultListableBeanFactoryTests { @@ -3287,6 +3313,18 @@ class DefaultListableBeanFactoryTests {
}
private static class PriorityTestBeanFactory {
public static LowPriorityTestBean lowPriorityTestBean() {
return new LowPriorityTestBean();
}
public static HighPriorityTestBean highPriorityTestBean() {
return new HighPriorityTestBean();
}
}
private static class NullTestBeanFactoryBean<T> implements FactoryBean<TestBean> {
@Override

Loading…
Cancel
Save