在Spring中指定包含值的列表的最简单方法是什么?

时间:2012-07-20 10:30:12

标签: java spring

假设我有一个很大的值列表aa bb cc dd ee ff gg等,我需要在春天作为构造函数传递

如果我需要配置为字符串数组,那么在spring中很容易,因为我们可以将值指定为逗号分隔为aa,bb,cc等。

如果我需要配置为列表,我需要执行以下操作

<bean name="myBean" class="MyClass">
    <constructor-arg>
        <list>
            <value>aa</value>
            <value>bb</value>
            <value>cc</value>
            <value>dd</value>
        </list>
    </constructor-arg>
</bean>

当数值增加时,它占据了一条巨大的线条而且看起来很丑陋。

有人可以帮助我如何将大值作为构造函数传递给字符串中的列表吗?

5 个答案:

答案 0 :(得分:22)

传递给列表的值是否来自属性文件? 如果是这样,您可以使用以下内容:

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

使用以下.properties文件

list.value=aa,bb,cc,dd   

如果没有,你显然可以直接通过:

<bean name="myBean" class="MyClass">
   <constructor-arg>
      <bean class="org.springframework.util.StringUtils" factory-method="commaDelimitedListToSet">
          <constructor-arg type="java.lang.String" value="aa,bb,cc,dd"/>
      </bean>
    </constructor-arg>
</bean> 

答案 1 :(得分:12)

Spring可以自动将任何逗号分隔的字符串转换为列表或数组:

public class Foo {
   public void setValueList(String[] values) { ... }
}

<bean class="Foo"
      p:valueList="a,b,c,d" />
<bean class="Foo"
      c:_0="a,b,c,d" />
<bean class="Foo">
     <constructor-arg><value>a,b,c,d</value></constructor-arg>
</bean>

事实上,即使字符串中只有1个值,也没有逗号,它仍然有效。

没有必要在另一个答案中提及org.springframework.util.StringUtils。

构造函数args的这个词(c:_0是使用c命名空间的&lt; constructor-arg index =“0”&gt;的缩写。

答案 2 :(得分:5)

您可以尝试更简单的方法,并使用Spring表达式语言将值转换为列表:

<bean name="myBean" class="MyClass">
    <constructor-arg value="#{T(java.util.Arrays).asList('${list.values}')}"/>
</bean>

答案 3 :(得分:0)

您可以实现一个构造函数,该构造函数将逗号分隔的String作为其参数(并将该字符串自己拆分为值)。

如果你想要一个适用于任何构造函数/属性的解决方案,你可以考虑实现自己的PropertyEditor并配置Spring来使用它。

答案 4 :(得分:0)

如果您使用的是最新的Spring框架版本(我相信是Spring 3.1+),则不需要在SpringEL中使用这些字符串拆分的内容,

只需在Spring的Configuration类(带有Configuration注释的类)中添加PropertySourcesPlaceholderConfigurer和DefaultConversionService即可,例如

@Configuration
public class AppConfiguration {

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

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

和您的班级

@Value("${list}")
private List<String> list;

或者,如果要这样做,请在构造函数的参数上使用@Value注释。

最后在属性文件中

list=A,B,C,D,E

没有DefaultConversionService,在将值注入字段时,只能将逗号分隔的String放入String数组,但是DefaultConversionService为您提供了一些方便的魔术,并将它们添加到Collection,Array等中。(检查实现是否您想进一步了解它)

有了这两个,它甚至可以处理所有多余的空格,包括换行符,因此您无需添加其他逻辑来修剪它们。