2013-02-15 11 views
7

Ho un bean Spring e nel bean Spring ho una dipendenza da un elenco di altri bean. La mia domanda è: come posso iniettare una lista generica di bean come dipendenza da quel bean?Inietta un elenco di bean usando l'annotazione Spring @Configuration

Per esempio, un codice:

public interface Color { } 

public class Red implements Color { } 

public class Blue implements Color { } 

mio fagiolo:

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(); 
    } 
} 

La domanda è; come ottengo l'elenco dei colori in Painter? Inoltre, su una nota a margine: dovrei avere il @Configuration restituire il tipo di interfaccia, o la classe?

Grazie per l'aiuto!

+0

Eventuali duplicati di [Auto-cablaggio di un elenco utilizzando lo schema util dà NoSuchBeanDefinitionException] (http://stackoverflow.com/questions/1363310/auto-wiring-a-list-using-util-schema-gives-nosuchbeandefinitionexception) – gstackoverflow

risposta

12

Quello che dovrebbe funzionare, avere un @Resource o @Autowired sul setter deve iniettare tutte le istanze di Colore sul tuo campo List<Color>.

Se si vuole essere più esplicito, è possibile restituire una raccolta come un altro bean:

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

e usarlo come un campo autowired questo modo:

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

O

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

Sulla tua domanda su come restituire un'interfaccia o un'implementazione, uno dovrebbe funzionare, ma interf l'asso dovrebbe essere preferito

+0

Ciao Biju, grazie per la risposta. Pensavo anche che avrebbe funzionato, ma un collega ha detto che quando schierava, Spring ha lanciato delle eccezioni. Lo esaminerò un po 'di più. Nel frattempo, ho usato un approccio simile a quello che hai suggerito. –

+0

Perfetto! Proprio quello che stavo cercando! – Flyingcows00

+0

C'è un modo per iniettare la lista in un altro metodo '@ Bean'? Apparentemente 'Elenco' è scomodo da iniettare per nome. I consigli sono di usare '@ Resource' ma questo non funziona come parametro param. – Stewart

Problemi correlati