Skip to content

Commit 889c4e0

Browse files
committedFeb 20, 2024
Reject multiple primary candidates in ancestor factory as well
Closes gh-26612
1 parent ad2e95b commit 889c4e0

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed
 

Diff for: ‎spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1805,7 +1805,7 @@ protected String determinePrimaryCandidate(Map<String, Object> candidates, Class
18051805
if (primaryBeanName != null) {
18061806
boolean candidateLocal = containsBeanDefinition(candidateBeanName);
18071807
boolean primaryLocal = containsBeanDefinition(primaryBeanName);
1808-
if (candidateLocal && primaryLocal) {
1808+
if (candidateLocal == primaryLocal) {
18091809
throw new NoUniqueBeanDefinitionException(requiredType, candidates.size(),
18101810
"more than one 'primary' bean found among candidates: " + candidates.keySet());
18111811
}

Diff for: ‎spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java

+33-3
Original file line numberDiff line numberDiff line change
@@ -2163,9 +2163,39 @@ void autowireBeanByTypeWithTwoPrimaryCandidates() {
21632163
lbf.registerBeanDefinition("test", bd);
21642164
lbf.registerBeanDefinition("spouse", bd2);
21652165

2166-
assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(() ->
2167-
lbf.autowire(DependenciesBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true))
2168-
.withCauseExactlyInstanceOf(NoUniqueBeanDefinitionException.class);
2166+
assertThatExceptionOfType(UnsatisfiedDependencyException.class)
2167+
.isThrownBy(() -> lbf.autowire(DependenciesBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true))
2168+
.withCauseExactlyInstanceOf(NoUniqueBeanDefinitionException.class);
2169+
}
2170+
2171+
@Test
2172+
void autowireBeanByTypeWithTwoPrimaryCandidatesInOneAncestor() {
2173+
DefaultListableBeanFactory parent = new DefaultListableBeanFactory();
2174+
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
2175+
bd.setPrimary(true);
2176+
RootBeanDefinition bd2 = new RootBeanDefinition(TestBean.class);
2177+
bd2.setPrimary(true);
2178+
parent.registerBeanDefinition("test", bd);
2179+
parent.registerBeanDefinition("spouse", bd2);
2180+
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(parent);
2181+
2182+
assertThatExceptionOfType(UnsatisfiedDependencyException.class)
2183+
.isThrownBy(() -> lbf.autowire(DependenciesBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true))
2184+
.withCauseExactlyInstanceOf(NoUniqueBeanDefinitionException.class);
2185+
}
2186+
2187+
@Test
2188+
void autowireBeanByTypeWithTwoPrimaryFactoryBeans(){
2189+
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
2190+
RootBeanDefinition bd1 = new RootBeanDefinition(LazyInitFactory.class);
2191+
RootBeanDefinition bd2 = new RootBeanDefinition(LazyInitFactory.class);
2192+
bd1.setPrimary(true);
2193+
bd2.setPrimary(true);
2194+
lbf.registerBeanDefinition("bd1", bd1);
2195+
lbf.registerBeanDefinition("bd2", bd2);
2196+
assertThatExceptionOfType(UnsatisfiedDependencyException.class)
2197+
.isThrownBy(() -> lbf.autowire(FactoryBeanDependentBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true))
2198+
.withCauseExactlyInstanceOf(NoUniqueBeanDefinitionException.class);
21692199
}
21702200

21712201
@Test

0 commit comments

Comments
 (0)
Please sign in to comment.