Test for mixed order across bean factory hierarchy

See gh-28374

(cherry picked from commit 48f3c08395)
This commit is contained in:
Juergen Hoeller
2023-11-22 12:38:04 +01:00
parent 6db00e63c7
commit f4ac323409

View File

@@ -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 {
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 {
}
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