diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java index 98f69c44d40..191e85583f4 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java @@ -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> 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 testBeanProvider = lbf.getBeanProvider(ResolvableType.forClass(TestBean.class)); + List 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 implements FactoryBean { @Override