我想在.properties文件中有一个值列表,即:
my.list.of.strings=ABC,CDE,EFG
并直接在我的类中加载它,即:
@Value("${my.list.of.strings}")
private List<String> myList;
据我所知,另一种方法是将它放在spring配置文件中,并将其作为bean引用加载(如果我错了请纠正我),即
<bean name="list">
<list>
<value>ABC</value>
<value>CDE</value>
<value>EFG</value>
</list>
</bean>
但是有没有办法做到这一点呢?使用.properties文件?
ps:如果可能的话,我想这样做没有任何自定义代码。
我更喜欢的方式(特别是字符串)是以下一个:
admin.user={'Doe, John','Headroom, Max','Mouse, Micky'}
和使用
@Value("#{${admin.user}}")
private List<String> userList;
通过这种方式,还可以在参数中包含逗号。它也适用于集合。
你是否考虑过@Autowireding构造函数或在body中使用setter和String.split() ?
class MyClass {
private List<String> myList;
@Autowired
public MyClass(@Value("${my.list.of.strings}") final String strs) {
myList = Arrays.asList(strs.split(","));
}
//or
@Autowired
public void setMyList(@Value("${my.list.of.strings}") final String strs) {
myList = Arrays.asList(strs.split(","));
}
}
我倾向于用这些方法中的一种来进行自动装配,以增强代码的可测试性。
考虑使用公共配置。它有内置的功能,以打破一个条目在属性文件数组/列表。结合SpEL和@Value应该会给你想要的
按照要求,这是你需要的(没有真正尝试过代码,可能会有一些错误,请原谅我):
在Apache Commons Configuration中,有PropertiesConfiguration。它支持将分隔字符串转换为数组/列表的特性。
例如,如果您有一个属性文件
#Foo.properties
foo=bar1, bar2, bar3
用下面的代码:
PropertiesConfiguration config = new PropertiesConfiguration("Foo.properties");
String[] values = config.getStringArray("foo");
会给你一个字符串数组["bar1", "bar2", "bar3"]
要和Spring一起使用,在你的app context xml中有这个:
<bean id="fooConfig" class="org.apache.commons.configuration.PropertiesConfiguration">
<constructor-arg type="java.lang.String" value="classpath:/Foo.properties"/>
</bean>
在你的春豆里加入这个:
public class SomeBean {
@Value("fooConfig.getStringArray('foo')")
private String[] fooArray;
}
我相信这是可行的:P
如果你使用的是最新的Spring框架版本(我相信是Spring 3.1+),你不需要在SpringEL中进行字符串分割,
简单地添加PropertySourcesPlaceholderConfigurer和DefaultConversionService在你的Spring的配置类(一个与配置注释),例如:
@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;
在属性文件中
list=A,B,C,D,E
如果没有DefaultConversionService,当您将值注入字段时,您只能将逗号分隔的字符串放入字符串数组中,但是DefaultConversionService为您做了一些方便的魔术,并将它们添加到Collection, array等(如果您想了解更多,请检查实现)。
有了这两个,它甚至可以处理包括换行符在内的所有多余的空白,因此您不需要添加额外的逻辑来修剪它们。
我更喜欢的方式(特别是字符串)是以下一个:
admin.user={'Doe, John','Headroom, Max','Mouse, Micky'}
和使用
@Value("#{${admin.user}}")
private List<String> userList;
通过这种方式,还可以在参数中包含逗号。它也适用于集合。
如果使用属性占位符,则ser1702544示例将变成
@Value("#{myConfigProperties['myproperty'].trim().replaceAll(\"\\s*(?=,)|(?<=,)\\s*\", \"\").split(',')}")
使用占位符xml:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="properties" ref="myConfigProperties" />
<property name="placeholderPrefix"><value>$myConfigProperties{</value></property>
</bean>
<bean id="myConfigProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:myprops.properties</value>
</list>
</property>
</bean>