Inject a list of beans using Spring @Configuration annotation

Erik Pragt picture Erik Pragt · Feb 15, 2013 · Viewed 17.5k times · Source

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

Biju Kunjummen picture Biju Kunjummen · Feb 15, 2013

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.