从属性文件中读取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;

据我所知,做这个的另一种方法是将它放在spring配置文件中,并将其作为一个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 (或你配置的地方)。 正如Dmitry Chornyi在评论中指出的那样,基于Java的配置看起来像:

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

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

也转换为其他类型的集合:

@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)配置一个ConversionService实例。 该转换服务将被Spring接收,然后在框架需要执行类型转换时使用。 [...]如果没有使用Spring注册ConversionService,则使用原始的基于PropertyEditor的系统。


你是否考虑过在构造函数或setter和String.split()中使用@Autowired

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

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

链接地址: http://www.djcxy.com/p/50903.html

上一篇: Reading a List from properties file and load with spring annotation @Value

下一篇: Downloading a file from spring controllers