Skip to content

Commit 48f3c08

Browse files
committed
Test for mixed order across bean factory hierarchy
See gh-28374
1 parent c609264 commit 48f3c08

File tree

1 file changed

+39
-1
lines changed

1 file changed

+39
-1
lines changed

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

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2154,18 +2154,44 @@ void autowireBeanByTypePrimaryTakesPrecedenceOverPriority() {
21542154
}
21552155

21562156
@Test
2157-
void beanProviderWithParentBeanFactoryReuseOrder() {
2157+
void beanProviderWithParentBeanFactoryDetectsOrder() {
21582158
DefaultListableBeanFactory parentBf = new DefaultListableBeanFactory();
21592159
parentBf.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
21602160
parentBf.registerBeanDefinition("regular", new RootBeanDefinition(TestBean.class));
21612161
parentBf.registerBeanDefinition("test", new RootBeanDefinition(HighPriorityTestBean.class));
21622162
lbf.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
21632163
lbf.setParentBeanFactory(parentBf);
21642164
lbf.registerBeanDefinition("low", new RootBeanDefinition(LowPriorityTestBean.class));
2165+
21652166
Stream<Class<?>> orderedTypes = lbf.getBeanProvider(TestBean.class).orderedStream().map(Object::getClass);
21662167
assertThat(orderedTypes).containsExactly(HighPriorityTestBean.class, LowPriorityTestBean.class, TestBean.class);
21672168
}
21682169

2170+
@Test // gh-28374
2171+
void beanProviderWithParentBeanFactoryAndMixedOrder() {
2172+
DefaultListableBeanFactory parentBf = new DefaultListableBeanFactory();
2173+
parentBf.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
2174+
lbf.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
2175+
lbf.setParentBeanFactory(parentBf);
2176+
2177+
lbf.registerSingleton("plainTestBean", new TestBean());
2178+
2179+
RootBeanDefinition bd1 = new RootBeanDefinition(PriorityTestBeanFactory.class);
2180+
bd1.setFactoryMethodName("lowPriorityTestBean");
2181+
lbf.registerBeanDefinition("lowPriorityTestBean", bd1);
2182+
2183+
RootBeanDefinition bd2 = new RootBeanDefinition(PriorityTestBeanFactory.class);
2184+
bd2.setFactoryMethodName("highPriorityTestBean");
2185+
parentBf.registerBeanDefinition("highPriorityTestBean", bd2);
2186+
2187+
ObjectProvider<TestBean> testBeanProvider = lbf.getBeanProvider(ResolvableType.forClass(TestBean.class));
2188+
List<TestBean> resolved = testBeanProvider.orderedStream().toList();
2189+
assertThat(resolved.size()).isEqualTo(3);
2190+
assertThat(resolved.get(0)).isSameAs(lbf.getBean("highPriorityTestBean"));
2191+
assertThat(resolved.get(1)).isSameAs(lbf.getBean("lowPriorityTestBean"));
2192+
assertThat(resolved.get(2)).isSameAs(lbf.getBean("plainTestBean"));
2193+
}
2194+
21692195
@Test
21702196
void autowireExistingBeanByName() {
21712197
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
@@ -3339,6 +3365,18 @@ private static class LowPriorityTestBean extends TestBean {
33393365
}
33403366

33413367

3368+
private static class PriorityTestBeanFactory {
3369+
3370+
public static LowPriorityTestBean lowPriorityTestBean() {
3371+
return new LowPriorityTestBean();
3372+
}
3373+
3374+
public static HighPriorityTestBean highPriorityTestBean() {
3375+
return new HighPriorityTestBean();
3376+
}
3377+
}
3378+
3379+
33423380
private static class NullTestBeanFactoryBean<T> implements FactoryBean<TestBean> {
33433381

33443382
@Override

0 commit comments

Comments
 (0)