【问题标题】:Spring: Injecting an Array or List of some type into a beanSpring:将某种类型的数组或列表注入 bean
【发布时间】:2013-03-08 16:27:33
【问题描述】:

如果我有一个接口I,以及一些实现它的类,是否可以将数组I[]List<I> 注入到bean 中?我看到可以使用<list></list>List<Object> 完成它,但我想在这里参数化我的列表 - 或者获取I 类型的数组。

列表/数组中的元素数量是固定的,并在运行前确定。

提前感谢您的任何反馈 :-)

【问题讨论】:

    标签: java spring


    【解决方案1】:

    我 Spring 3.1 可以将其注入为:

    @Inject
    List<I> list;
    

    I 是您的界面(但应该是具体的)。

    或者您可以使用 Spring Java Config (@Configuration) 生成 (@Bean) 命名列表并使用 Qualifier@Named 注入它们。

    您也可以将类型化命名列表定义为here:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/util    http://www.springframework.org/schema/util/spring-util-2.5.xsd">
    
    
    <util:list id="myList" value-type="java.lang.String">
        <value>foo</value>
        <value>bar</value>
    </util:list>
    

    【讨论】:

      【解决方案2】:

      这是不可能实现的,因为编译时的 JAVA 类型擦除。 JAVA 泛型仅在编译时可用,用于确保类型安全。在运行时只剩下对象的(引用)。

      唯一能确保类型安全(但仍然是运行时)的方法是拥有一个任意类型的数组并使用 spring 标签来填充数据。然后在运行时,当您尝试使用字符串填充 Integer[] 时会出现异常。

      如果您使用泛型,您可以使用 Set 并在运行时以 Set 结束,因为提到的类型擦除。

      【讨论】:

      【解决方案3】:

      如果您想要基于泛型类型的动态自动装配,那么不,由于类型擦除。如果您只想连接一个定义为类型List&lt;String&gt;(或其他)的列表,则没有什么可以阻止您这样做,例如:

      应用程序上下文:

      <util:list id="theList">
          <value>a</value>
          <value>b</value>
      </util:list>
      

      Java 类:

      @Resource(name = "theList")
      List<String> theList;  
      

      不过,这不会提供类型安全性。

      【讨论】:

      • 错误,因为 List&lt;String&gt; theList 字段(或方法参数)声明中没有“删除”任何内容。类型擦除不是这个答案所暗示的;看看Reflection API,尤其是GenericDeclarationParameterizedType
      猜你喜欢
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多