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

时间:2015-02-20 18:21:00

标签: java spring spring-el

我正在尝试在弹簧注入下方使用字符串列表。

<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

2 个答案:

答案 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