2013-02-15 63 views
7

我有一個Spring bean,而在Spring Bean中,我對其他bean列表有依賴關係。我的問題是:我如何注入一個泛型bean列表作爲該bean的依賴關係?使用Spring @Configuration註釋注入bean列表

例如,一些代碼:

public interface Color { } 

public class Red implements Color { } 

public class Blue implements Color { } 

我的豆:

public class Painter { 
    private List<Color> colors; 

    @Resource 
    public void setColors(List<Color> colors) { 
     this.colors = colors; 
    } 
} 

@Configuration 
public class MyConfiguration { 

    @Bean 
    public Red red() { 
    return new Red(); 
    } 

    @Bean 
    public Blue blue() { 
    return new Blue(); 
    } 

    @Bean 
    public Painter painter() { 
    return new Painter(); 
    } 
} 

的問題是;我如何獲得Painter中的顏色列表?此外,在旁邊注意:我應該有@Configuration返回接口類型,或類?

感謝您的幫助!

+0

的可能的複製[自動佈線列表使用util的架構給出NoSuchBeanDefinitionException](http://stackoverflow.com/questions/1363310/auto-wiring-a-list-using-util-schema-gives-nosuchbeandefinitionexception) – gstackoverflow 2015-11-03 19:11:03

回答

12

你應該有什麼工作,有一個@Resource@Autowired上的設置應注入顏色的所有實例List<Color>字段。

如果你想更明確的,你可以返回一個集合作爲另一個bean:

@Bean 
public List<Color> colorList(){ 
    List<Color> aList = new ArrayList<>(); 
    aList.add(blue()); 
    return aList; 
}  

,並用它作爲自動裝配Autowired場這樣:

@Resource(name="colorList") 
public void setColors(List<Color> colors) { 
    this.colors = colors; 
} 

OR

@Resource(name="colorList") 
private List<Color> colors; 

關於返回接口或實現的問題,任何一個都應該可以工作,但是interf王牌應該是首選。

+0

嗨Biju,謝謝你的答案。我也認爲它會起作用,但一位同事表示,在部署時,Spring會拋出異常。我會再調查一下。在此期間,我使用了與您所建議的類似的方法。 – 2013-02-15 12:49:46

+0

完美!正是我在找的! – Flyingcows00 2014-09-03 16:42:54

+0

有沒有辦法將列表注入另一個'@ Bean'方法?顯然'List'的名字很難注入。建議使用'@ Resource',但這不作爲方法參數。 – Stewart 2017-03-06 11:46:28