Skip to content

Commit

Permalink
Test for mixed order across bean factory hierarchy
Browse files Browse the repository at this point in the history
  • Loading branch information
jhoeller committed Nov 22, 2023
1 parent c609264 commit 48f3c08
Showing 1 changed file with 39 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -2154,18 +2154,44 @@ void autowireBeanByTypePrimaryTakesPrecedenceOverPriority() {
}

@Test
void beanProviderWithParentBeanFactoryReuseOrder() {
void beanProviderWithParentBeanFactoryDetectsOrder() {
DefaultListableBeanFactory parentBf = new DefaultListableBeanFactory();
parentBf.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
parentBf.registerBeanDefinition("regular", new RootBeanDefinition(TestBean.class));
parentBf.registerBeanDefinition("test", new RootBeanDefinition(HighPriorityTestBean.class));
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);
Expand Down Expand Up @@ -3339,6 +3365,18 @@ private static class LowPriorityTestBean extends TestBean {
}


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
Expand Down

0 comments on commit 48f3c08

Please sign in to comment.