假设我有一个很大的值列表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>
当数值增加时,它占据了一条巨大的线条而且看起来很丑陋。
有人可以帮助我如何将大值作为构造函数传递给字符串中的列表吗?
答案 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等中。(检查实现是否您想进一步了解它)
有了这两个,它甚至可以处理所有多余的空格,包括换行符,因此您无需添加其他逻辑来修剪它们。