我正在尝试在弹簧注入下方使用字符串列表。
<bean name="myBean" class="java.util.HashSet">
<constructor-arg type="java.util.Collection" value="#{'${my.list.of.strings}'.split(',')}"/>
</bean>
我将String "'${my.list.of.strings}'.split(',')"
作为构造函数参数而不是字符串列表。
是否有版本问题?
我正在使用Spring Release 2.5,spring-beans 2.0.xsd
答案 0 :(得分:1)
如果你的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.RELEASE)。
但是你希望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
}
答案 1 :(得分:0)
Spring Expression Language(spring-el)仅出现在Spring 3.0中。你的表达式不会用Spring 2.5进行评估,你需要以不同的方式做到这一点。
即使使用Spring 3,我也建议您尝试另一种方法来构建您的设置,例如使用FactoryBean
(请参阅Customizing instantiation logic using FactoryBeans)