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 失败了!

4

1 回答 1

20

原因是两个 bean 实际上具有相同的 name foo,因此在内部,一个 bean 定义被另一个覆盖,本质上,@Bean一个被 扫描的bean 覆盖@ComponentScan

修复只是给它们中的一个赋予不同的名称,您应该会看到@Primary注入 bean 的正确行为。

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

或者

@Component("foo1")
public class Foo
{
..
于 2013-08-01T09:00:56.100 回答