从属性文件中以逗号分隔的列表作为Spring Bean中的构造函数参数



我正在尝试使用下面的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)。

但是您希望myBeanbean属于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自定义实例化逻辑)

最新更新