Spring - @Primary не подходит для @ComponentScan?

Для простого POJO:

@Component
public class Foo
{
    private final String string;

    public Foo()
    {
        this("Secondary ComponentScan??");
    }

    public Foo(String string)
    {
        this.string = string;
    }

    @Override
    public String toString()
    {
        return string;
    }
}

и эта конфигурация

@Configuration
@ComponentScan(basePackageClasses = Foo.class)
public class TestConfiguration
{
    @Primary
    @Bean
    public Foo foo()
    {
        return new Foo("Primary bean!!");
    }
}

Я бы ожидал следующего теста

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfiguration.class)
public class Test
{
    @Autowired
    private Foo foo;

    @Test
    public void test()
    {
        System.out.println(foo);
    }
}

чтобы распечатать Primary Bean!!, но вместо этого возвращает Secondary ComponentScan??...

Как получилось? Нигде документация для @Primary говорит, что она не работает с компонентным отсканированным beans!

Ответ 1

Причина в том, что оба beans фактически имеют одно и то же имя foo, поэтому внутреннее определение bean становится переопределенным с другим, по существу, с @Bean становится переопределенным тем, которое сканируется на @ComponentScan.

Исправление состоит лишь в том, чтобы дать одному из них другое имя, и вы должны увидеть правильное поведение вставляемого @Primary bean.

@Primary
@Bean
public Foo foo1()
{
    return new Foo("Primary bean!!");
}

ИЛИ

@Component("foo1")
public class Foo
{
..