2016-06-28 49 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