从属性文件中读取一个List,并用Spring注解@Value加载

类似于这个问题: http : //forum.springsource.org/showthread.php?111992-Loading-a-list-from-properties-file-using-Value-annotation (对此没有答复)

我想在.properties文件中有一个值列表,例如:

my.list.of.strings=ABC,CDE,EFG 

并直接将其加载到我的课程中,即:

 @Value("${my.list.of.strings}") private List<String> myList; 

据我所知,这样做的另一种方法是在春季configuration文件,并加载它作为一个bean引用(纠正我,如果我错了),即

 <bean name="list"> <list> <value>ABC</value> <value>CDE</value> <value>EFG</value> </list> </bean> 

但有没有办法做到这一点? 使用.properties文件? ps:如果可能的话,我想用这个自定义代码来做这个。

使用Spring EL:

  @Value("#{'${my.list.of.strings}'.split(',')}") private List<String> myList; 

假设您的属性文件使用以下方法正确加载:

 my.list.of.strings=ABC,CDE,EFG 

从Spring 3.0开始,你可以添加一行

 <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" /> 

到你的applicationContext.xml (或你configuration的东西)。 正如Dmitry Chornyi在评论中指出的那样,基于Java的configuration看起来像:

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

这将激活支持将String转换为Collectiontypes的新configuration服务。 如果你没有激活这个configuration服务,那么Spring会回到它的遗留属性编辑器,作为configuration服务,它不支持这种转换。

转换为其他types的作品也是如此:

 @Value("${my.list.of.ints}") private List<Integer> myList 

将像一条线一起工作

  my.list.of.ints= 1, 2, 3, 4 

没有空白的问题, ConversionServiceFactoryBean照顾它。

请参阅http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#core-convert-Spring-config

在Spring应用程序中,通常为每个Spring容器(或ApplicationContext)configuration一个ConversionService实例。 该转换服务将被Spring拿起,然后在框架需要执行types转换时使用。 […]如果没有使用Spring注册ConversionService,则使用原始的基于PropertyEditor的系统。

你认为@Autowired构造函数或setter和String.split() ing在身体?

 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(",")); } } 

我倾向于使用这些方法之一来进行自动assembly,以增强我的代码的可testing性。

通过在.properties文件中指定my.list.of.strings=ABC,CDE,EFG并使用

@Value("${my.list.of.strings}") private String[] myString;

你可以得到string的数组。 并使用CollectionUtils.addAll(myList, myString) ,您可以获取string列表。

以上所有答案都是正确的。 但是你可以在一行中实现这一点。 请尝试下面的声明,你会得到一个string列表中的所有逗号分隔值。

 private @Value("#{T(java.util.Arrays).asList(projectProperties['my.list.of.strings'])}") List<String> myList; 

还需要在xmlconfiguration中定义以下行。

 <util:properties id="projectProperties" location="/project.properties"/> 

只需要replace你的属性文件的path和文件名。 你很好走。 🙂

希望这可以帮助你。 干杯。

你可以用这样的注释来做到这一点

  @Value("#{T(java.util.Arrays).asList('${my.list.of.strings:a,b,c}')}") private List<String> mylist; 

这里my.list.of.strings将被从属性文件中挑选出来,如果它不存在,那么将使用默认的a,b,c

并在你的属性文件中,你可以有这样的事情

my.list.of.strings = d,E,F

考虑使用Commonsconfiguration。 它内置的function可以将属性文件中的条目分割为数组/列表。 与SpEL和@Value精梳应该给你想要的


根据要求,这里是你需要的(没有真正尝试过的代码,可能会有一些错误,请耐心等待):

在Apache Commons Configuration中,有PropertiesConfiguration。 它支持将分隔string转换为数组/列表的function。

例如,如果你有一个属性文件

 #Foo.properties foo=bar1, bar2, bar3 

用下面的代码:

 PropertiesConfiguration config = new PropertiesConfiguration("Foo.properties"); String[] values = config.getStringArray("foo"); 

会给你一个["bar1", "bar2", "bar3"]的string数组

要使用Spring,请在您的应用上下文中使用xml:

 <bean id="fooConfig" class="org.apache.commons.configuration.PropertiesConfiguration"> <constructor-arg type="java.lang.String" value="classpath:/Foo.properties"/> </bean> 

并在你的spring豆有这个:

 public class SomeBean { @Value("fooConfig.getStringArray('foo')") private String[] fooArray; } 

我相信这应该工作:P

小心值中的空格。 我可能是错的,但我认为逗号分隔列表中的空格不会被@Value和Spel截断。 列表

 foobar=a, b, c 

将作为string列表读入

 "a", " b", " c" 

在大多数情况下,你可能不想要的空间!

expression方式

 @Value("#{'${foobar}'.trim().replaceAll(\"\\s*(?=,)|(?<=,)\\s*\", \"\").split(',')}") private List<String> foobarList; 

会给你一个string列表:

 "a", "b", "c". 

正则expression式删除逗号前后的所有空格。 值中的空格不会被删除。 所以

 foobar = AA, BB, CCC 

应该导致价值

 "AA", "BB", "CCC". 

如果使用属性占位符,那么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>