【发布时间】:2013-03-08 16:27:33
【问题描述】:
如果我有一个接口I,以及一些实现它的类,是否可以将数组I[] 或List<I> 注入到bean 中?我看到可以使用<list></list> 为List<Object> 完成它,但我想在这里参数化我的列表 - 或者获取I 类型的数组。
列表/数组中的元素数量是固定的,并在运行前确定。
提前感谢您的任何反馈 :-)
【问题讨论】:
如果我有一个接口I,以及一些实现它的类,是否可以将数组I[] 或List<I> 注入到bean 中?我看到可以使用<list></list> 为List<Object> 完成它,但我想在这里参数化我的列表 - 或者获取I 类型的数组。
列表/数组中的元素数量是固定的,并在运行前确定。
提前感谢您的任何反馈 :-)
【问题讨论】:
我 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>
【讨论】:
这是不可能实现的,因为编译时的 JAVA 类型擦除。 JAVA 泛型仅在编译时可用,用于确保类型安全。在运行时只剩下对象的(引用)。
唯一能确保类型安全(但仍然是运行时)的方法是拥有一个任意类型的数组并使用 spring 标签来填充数据。然后在运行时,当您尝试使用字符串填充 Integer[] 时会出现异常。
如果您使用泛型,您可以使用 Set
【讨论】:
如果您想要基于泛型类型的动态自动装配,那么不,由于类型擦除。如果您只想连接一个定义为类型List<String>(或其他)的列表,则没有什么可以阻止您这样做,例如:
应用程序上下文:
<util:list id="theList">
<value>a</value>
<value>b</value>
</util:list>
Java 类:
@Resource(name = "theList")
List<String> theList;
不过,这不会提供类型安全性。
【讨论】:
List<String> theList 字段(或方法参数)声明中没有“删除”任何内容。类型擦除不是这个答案所暗示的;看看Reflection API,尤其是GenericDeclaration和ParameterizedType。