【问题标题】:How does Spring inject list as constructor argumentSpring如何注入列表作为构造函数参数
【发布时间】:2014-09-02 15:54:03
【问题描述】:

我有这个:

@Named
@Singleton
public class MyDefaultDef {

  @Inject
  public MyDefaultDef(SomeRef someRef, List<AnotherRef> anotherRefs) {
    //...
  }
  //...
}

问题 1:[main] List&lt;AnotherRef&gt; anotherRefs 作为构造函数 arg 的自动装配如何工作?

我的意思是,如果我想用 xml 替换那个 bean 定义,我必须指定列表的每个元素。 IE。

<constructor-arg>
  <list> 
     <ref bean="..."/>
     <ref bean="..."/>
  </list> 
</constructor-arg>

但是在注解的情况下 Spring 从哪里获取这些元素?

问题2: 如何将MyDefaultDef bean 定义替换为xml?

【问题讨论】:

  • 使用@Autowired List&lt;SomeBean&gt;,Spring 将在该类型的上下文中找到所有bean。
  • @SotiriosDelimanolis 谢谢!你回答了我的第一个问题!请回答第二个好吗?
  • @SotiriosDelimanolis 或者你能回答我的另一个问题stackoverflow.com/questions/25627108/…请。其实这个问题有两种解决方案:回答这个问题或回答那个问题

标签: java spring


【解决方案1】:

当 Spring 需要自动装配 List&lt;SomeBean&gt; 时,它会查找其 BeanFactory 中的所有 bean 并检索所有类型为 SomeBean 的 bean。然后它会创建一个List 并将它们添加到其中。然后它会自动装配它。

Spring XML 中无法按类型列出此列表。你需要妥协。你就这样离开了你的班级

public class MyDefaultDef {

    @Inject
    public MyDefaultDef(SomeRef someRef, List<AnotherRef> anotherRefs) {
        //...
    }
    //...
}

然后简单地声明

<bean class="com.example.MyDefaultDef" autowire="constructor"/>

Spring 最终会使用上面的构造函数。

【讨论】:

  • 你能建议如何做到这一点stackoverflow.com/questions/25627108/…。因为按照您上面描述的方式,它不会覆盖 bean def
  • @V_B 为什么希望它覆盖(哪个)bean 定义?你的班级还有@Named吗?您可以将显式 name 属性添加到 &lt;bean&gt; 声明。
  • @SotiripsDelimanolis 我希望MyDefaultDefHeir tp 覆盖MyDefaultDef。但永远不能
  • @V_B 我不知道MyDefaultDefHeir 是什么。这似乎是另一个问题的一部分。请继续讨论。如果我能提供帮助,我会在那里发帖。
  • 是的,当然。你已经回答了这个问题。我只是问你是否知道那个问题的答案。无论如何 - 谢谢
猜你喜欢
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2018-03-27
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多