Observed Issue
In Spring boot 3.3, duplicate named beans can be defined where @Primary can be used as the default. In Spring Boot 3.4 RC1, this behavior is no longer the same.
Consider the following example of two named beans with different behaviors.
@TestConfiguration
public class TestConfig {
@Bean(name = "foo")
@Primary
@ConditionalOnProperty(name = "foo.truthy", havingValue = "true", matchIfMissing = true)
Boolean fooIsTrue() {
return true;
}
@Bean(value = "foo", defaultCandidate = false)
Boolean fooIsFalse() {
return false;
}
}
When validated in the following test, SB 3.3 expectely injects the "truthful" bean version marked as @Primary.
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = { TestConfig.class })
public class ConditionalTest {
@Autowired
@Qualifier("foo")
Boolean foo;
@Test
void checkFoo() {
assertTrue(foo);
}
}
When this same test is applied in Spring Boot 3.4 RC1, the @Primary "foo" bean is no longer created, causing this test evaluation to fail.
Is this an exepcted change in behavior?
Reproducer This test is available here