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