我正在尝试使用下面的spring注入作为字符串列表。
<bean name="myBean" class="java.util.HashSet">
<constructor-arg type="java.util.Collection" value="#{'${my.list.of.strings}'.split(',')}"/>
</bean>
我正在获取字符串"'${my.list.of.strings}'.split(',')"
作为构造函数参数,而不是字符串列表。
是否存在版本问题?
我使用的是Spring Release 2.5,Spring-beans 2.0.xsd
如果您的bean不是HashSet
,并且有一个接受数组作为参数的构造函数,那么您可以执行以下操作:
<bean name="myBean" class="mypackage.MyBeanClass">
<constructor-arg type="java.lang.String[]" value="${my.list.of.strings}" />
</bean>
或者这个:
<bean name="myBean" class="mypackage.MyBeanClass">
<constructor-arg>
<value type="java.lang.String[]">${my.list.of.strings}</value>
</constructor-arg>
</bean>
(我不记得哪种方式是Spring 2.5的正确方式,实际上我甚至不记得你是否可以使用占位符。如果是这样的话,请考虑使用Spring的最后一个版本,现在是4.1.5.REASE)。
但是您希望myBean
bean属于HashSet
类。我能想到的唯一解决方案是使用自己的类来包装HashSet
,或者可能从中扩展:
package mypackage;
// imports ommited
public class MyBeanClass extends HashSet<String> {
public MyBeanClass(String[] values) {
super(Arrays.asList(values));
}
}
如果你不喜欢直接从HashSet
继承这个想法,那么包装它,并让包装器委托你想要的所有方法:
package mypackage;
// imports ommited
public class MyBeanClass implements Set<String> {
private final Set<String> delegate;
public MyBeanClass(String[] values) {
this.delegate = new HashSet(Arrays.asList(values));
}
public boolean add(String element) {
return this.delegate.add(element);
}
public boolean contains(Object element) {
return this.delegate.contains(element);
}
// TODO rest of delegate methods
}
Spring表达式语言(Spring-el)只出现在Spring 3.0中。您的表达式将不会使用Spring2.5进行评估,您需要以不同的方式进行评估。
即使使用Spring3,我也建议找到另一种方法来构建您的集合,例如使用FactoryBean
(请参阅使用FactoryBeans自定义实例化逻辑)