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!
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.