对于简单的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失败!
原因是两个bean实际上具有相同的名称foo
,因此内部一个bean定义将被另一个bean覆盖,本质上,一个bean定义@Bean
将被by扫描的一个bean覆盖@ComponentScan
。
解决方法是简单地给其中一个使用不同的名称,并且您应该看到@Primary
注入的Bean 的正确行为。
@Primary
@Bean
public Foo foo1()
{
return new Foo("Primary bean!!");
}
要么
@Component("foo1")
public class Foo
{
..
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句