【问题标题】:Inject a list of beans using Spring @Configuration annotation使用 Spring @Configuration 注解注入 bean 列表
【发布时间】:2013-02-15 10:32:02
【问题描述】:

我有一个 Spring bean,在 Spring Bean 中我依赖于其他 bean 的列表。我的问题是:如何注入一个通用的 bean 列表作为该 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 返回接口类型还是类?

感谢您的帮助!

【问题讨论】:

标签: java spring spring-annotations


【解决方案1】:

你所拥有的应该可以工作,在 setter 上有一个 @Resource 或 @Autowired 应该将所有 Color 实例注入你的 List&lt;Color&gt; 字段。

如果你想更明确,你可以返回一个集合作为另一个 bean:

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

并以这种方式将其用作自动装配字段:

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

或

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

关于返回接口或实现的问题,任何一个都应该可以工作,但应该首选接口。

【讨论】:

  • 嗨,Biju,感谢您的回答。我也觉得可以,但是有同事说在部署的时候,Spring抛出了异常。我将对此进行更多调查。同时,我使用了与您建议的方法类似的方法。
  • 完美!正是我想要的!
  • 有没有办法将列表注入另一个@Bean 方法?显然List 很难按名称注入。建议使用@Resource,但这不能作为方法参数。
猜你喜欢
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多