【问题标题】:Spring - @Primary fails against @ComponentScan?Spring - @Primary 对 @ComponentScan 失败?
【发布时间】:2013-07-30 11:03:11
【问题描述】:

对于一个简单的 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 失败!

【问题讨论】:

    标签: java spring testing configuration spring-test


    【解决方案1】:

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

    解决方法是简单地给其中一个命名,您应该会看到@Primary bean 被注入的正确行为。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      • 2020-11-21
      • 2015-03-28
      相关资源
      最近更新 更多