Skip to content

Commit 31beedf

Browse files
committed
ListableBeanFactory::getBeansOfType should honor bean order
Fix spring-projectsGH-34688 Signed-off-by: Yanming Zhou <[email protected]>
1 parent 533283a commit 31beedf

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java

+11
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@
119119
* @author Phillip Webb
120120
* @author Stephane Nicoll
121121
* @author Sebastien Deleuze
122+
* @author Yanming Zhou
122123
* @since 16 April 2001
123124
* @see #registerBeanDefinition
124125
* @see #addBeanPostProcessor
@@ -742,6 +743,16 @@ public <T> Map<String, T> getBeansOfType(
742743
throw ex;
743744
}
744745
}
746+
return sort(result);
747+
}
748+
749+
private <T> Map<String, T> sort(Map<String, T> matchingBeans) {
750+
List<Map.Entry<String, T>> list = new ArrayList<>(matchingBeans.entrySet());
751+
list.sort(Map.Entry.comparingByValue(adaptOrderComparator(matchingBeans)));
752+
Map<String, T> result = CollectionUtils.newLinkedHashMap(list.size());
753+
for(Map.Entry<String, T> entry : list) {
754+
result.put(entry.getKey(), entry.getValue());
755+
}
745756
return result;
746757
}
747758

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

+25
Original file line numberDiff line numberDiff line change
@@ -1549,6 +1549,31 @@ void orderFromAttributeOverridesAnnotation() {
15491549
.containsExactly("fromLowestPrecedenceTestBeanFactoryBean");
15501550
}
15511551

1552+
@Test
1553+
void orderIsHonoredByMapOfBeans() {
1554+
RootBeanDefinition bd1 = new RootBeanDefinition();
1555+
bd1.setBeanClass(TestBean.class);
1556+
bd1.setPropertyValues(new MutablePropertyValues(List.of(new PropertyValue("name", "bean1"))));
1557+
bd1.setAttribute(AbstractBeanDefinition.ORDER_ATTRIBUTE, Ordered.LOWEST_PRECEDENCE);
1558+
lbf.registerBeanDefinition("bean1", bd1);
1559+
RootBeanDefinition bd2 = new RootBeanDefinition();
1560+
bd2.setBeanClass(DerivedTestBean.class);
1561+
bd2.setPropertyValues(new MutablePropertyValues(List.of(new PropertyValue("name", "bean2"))));
1562+
bd2.setAttribute(AbstractBeanDefinition.ORDER_ATTRIBUTE, Ordered.HIGHEST_PRECEDENCE);
1563+
lbf.registerBeanDefinition("bean2", bd2);
1564+
RootBeanDefinition bd3 = new RootBeanDefinition();
1565+
bd3.setBeanClass(TestBean.class);
1566+
bd3.setPropertyValues(new MutablePropertyValues(List.of(new PropertyValue("name", "bean3"))));
1567+
bd3.setAttribute(AbstractBeanDefinition.ORDER_ATTRIBUTE, Ordered.HIGHEST_PRECEDENCE + 1);
1568+
lbf.registerBeanDefinition("bean3", bd3);
1569+
RootBeanDefinition bd4 = new RootBeanDefinition();
1570+
bd4.setBeanClass(TestBean.class);
1571+
bd4.setPropertyValues(new MutablePropertyValues(List.of(new PropertyValue("name", "bean4"))));
1572+
bd4.setAttribute(AbstractBeanDefinition.ORDER_ATTRIBUTE, Ordered.LOWEST_PRECEDENCE - 1);
1573+
lbf.registerBeanDefinition("bean4", bd4);
1574+
assertThat(lbf.getBeansOfType(TestBean.class).keySet()).containsExactly("bean2", "bean3", "bean4", "bean1");
1575+
}
1576+
15521577
@Test
15531578
void invalidOrderAttribute() {
15541579
GenericBeanDefinition bd1 = new GenericBeanDefinition();

0 commit comments

Comments
 (0)