2016-06-28 50 views
0

我想创建两个实现相同接口的bean。豆类有名字,但是当我使用@Qualifier注释创建两个实现相同接口的bean

有错误,如:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cdPlayer' defined in soundsystem.CDPlayerConfig: Unsatisfied dependency expressed through method 'cdPlayer' parameter 0: No qualifying bean of type [soundsystem.CompactDisc] is defined: expected single matching bean but found 2: sss,aaa; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [soundsystem.CompactDisc] is defined: expected single matching bean but found 2: sss,aaa 

这是我的配置类。

@Configuration 
public class CDPlayerConfig { 

@Bean(name="bbb") 
public CompactDisc blankDisc(){ 
    List<String> list = new LinkedList<>(); 
    list.add("qwer"); 
    list.add("qazw"); 
    return new BlankDisc("one", "two", list); 
} 

@Bean(name="aaa") 
public CompactDisc sgtPeppers(){ 
    return null; 
} 
@Bean 
public MediaPlayer cdPlayer(CompactDisc cd){ 
    return new CDPlayer(cd); 
} 
} 

这是我的测试类。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes=CDPlayerConfig.class) 
public class CDPlayerTest { 

@Rule 
public final SystemOutRule log = new SystemOutRule().enableLog(); 

@Autowired 
private MediaPlayer player; 

@Autowired 
@Qualifier("aaa") 
private CompactDisc cd; 

@Test 
public void cdShouldNotBeNull(){ 
    assertNotNull(cd); 
} 


@Test 
public void play(){ 
    player.play(); 
    assertEquals("XYZ", log.getLogWithNormalizedLineSeparator()); 
} 
} 

编辑: 我的CD播放器类

public class CDPlayer implements MediaPlayer { 

private CompactDisc cd; 

@Autowired 
public CDPlayer(CompactDisc cd){ 
    this.cd = cd; 
} 
@Override 
public void play() { 
    // TODO Auto-generated method stub 
    cd.play(); 
} 
} 

回答

0

春天试图注入豆Compactdisc这里:

@Bean 
public MediaPlayer cdPlayer(CompactDisc cd){ 
    return new CDPlayer(cd); 
} 

你必须在@Qualifier注释添加到CompactDisc

的另一种方式是移除CD播放器的构造函数参数,并把它作为参数传递给play方法

+0

还不行。当我使用@Primary注释它可以工作,但我想按名称选择。我添加了CDPlayer类代码 – lassa

+0

从CDplayer构造函数中删除参数,并将其作为Play方法的参数 – Jens

+0

它的工作原理。谢谢:) – lassa

2

你的代码更改为以下:

@Bean 
public MediaPlayer cdPlayer(@Qualifier("bbb") CompactDisc cd){ 
    return new CDPlayer(cd); 
} 
+0

仍然无法正常工作。当我使用@Primary注释它可以工作,但我想按名称选择。我添加了CDPlayer类代码 – lassa