Erik Erik - 4 months ago 20
Java Question

Inject a list of beans using Spring @Configuration annotation

I've got a Spring bean, and in the Spring Bean I have a dependency on a list of other beans. My question is: how can I inject a Generic list of beans as a dependency of that bean?

For example, some code:

public interface Color { }

public class Red implements Color { }

public class Blue implements Color { }


My bean:

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


The question is; how do I get the list of colors in the Painter? Also, on a side note: should I have the @Configuration return the Interface type, or the class?

Thanks for the help!

Answer

What you have should work, having a @Resource or @Autowired on the setter should inject all instances of Color to your List<Color> field.

If you want to be more explicit, you can return a collection as another bean:

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

and use it as an autowired field this way:

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

OR

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

On your question about returning an interface or an implementation, either one should work, but interface should be preferred.