将动态属性列表读入spring托管bean

时间:2011-03-11 14:47:20

标签: spring dynamic javabeans

我一直在搜索,但找不到这些步骤。我希望我遗漏了一些明显的东西。

我有一个包含以下内容的属性文件:

machines=A,B

我有另一个这样的文件,但在这个机器元素中有不同数量的成员:

machines=B,C,D

我的问题是如何以一般方式将这个可变长度的机器变量加载到我的spring配置中的bean中?

类似的东西:

<property name="machines" value="${machines}"/>

其中machines是我的java代码中的数组或列表。如果我能弄清楚如何做到这一点,我可以定义它。

基本上我宁愿让spring进行解析并将每个值都粘贴到list元素中,而不是我必须编写一些读取完整机器字符串并自己进行解析(使用逗号分隔符)来放置每个值到数组或列表。有没有一种简单的方法可以做到这一点,我错过了?

5 个答案:

答案 0 :(得分:31)

您可能想看一下Spring的StringUtils类。它有许多有用的方法可以将逗号分隔列表转换为Set或String数组。您可以使用Spring的工厂方法框架将任何这些实用程序方法注入到bean中。这是一个例子:

<property name="machines">
    <bean class="org.springframework.util.StringUtils" factory-method="commaDelimitedListToSet">
        <constructor-arg type="java.lang.String" value="${machines}"/>
    </bean>
</property>

在此示例中,“machines”的值是从属性文件加载的。

如果现有的实用程序方法不能满足您的需求,那么创建自己的方法非常简单。此技术允许您执行任何静态实用程序方法。

答案 1 :(得分:19)

Spring EL变得更容易。 爪哇:

List <String> machines;

上下文:

<property name="machines" value="#{T(java.util.Arrays).asList('${machines}')}"/>

答案 2 :(得分:16)

如果你将属性“machines”作为一个String数组,那么spring会自动为你做

machines=B,C,D

<property name="machines" value="${machines}"/>

public void setMachines(String[] test) {

答案 3 :(得分:4)

从Spring 3.0开始,也可以使用@Value注释读入值列表。

属性文件:

machines=B,C,D

Java代码:

import org.springframework.beans.factory.annotation.Value;

@Value("#{'${machines}'.split(',')}")
private List<String> machines;

答案 4 :(得分:0)

您可以直接将值插入列表,而无需样板代码。(Spring 3.1 +)

@Value("${machines}")
private List<String> machines;
通过在配置中创建以下两个实例,

在属性文件中的键“ machines = B,C,D”。

@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

@Bean 
public ConversionService conversionService() {
    return new DefaultConversionService();
}

这些内容还将涵盖所有基于分离的拆分和空白修剪。