Spring - @Primary在@ComponentScan中失效了吗?

12

对于一个简单的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的文档中从未提到它不能与组件扫描的bean一起使用!

1个回答

20

原因是这两个bean实际上拥有相同的名称foo,所以内部一个bean定义被另一个覆盖,基本上使用@Bean的那个被@ComponentScan扫描到的那个覆盖了。

修复方法很简单,只要给它们中的一个不同的名称,你应该能看到正确行为的@Primary bean 被注入。

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

或者

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接