java - propertysourcesplaceholderconfigurer - 从属性文件中读取List并使用Spring注解@Value加载




spring.profiles.include (7)

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

foobar=a, b, c

将作为字符串列表读入

"a", " b", " c"

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

表达方式

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

会给你一个字符串列表:

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

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

foobar = AA, B B, CCC

应该导致值

"AA", "B B", "CCC".

类似于这个问题: http://forum.springsource.org/showthread.php?111992-Loading-a-list-from-properties-file-using-Value-annotation : 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 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的系统。


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

 @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


你是否考虑过在构造函数或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(","));
    }
}

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


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

如果您正在阅读本文,并且您使用的是Spring Boot ,那么此功能还有另外1个选项

通常逗号分隔的列表对于真实世界的用例来说非常笨拙(如果你想在你的配置中使用逗号,有些时候甚至不可行):

[email protected],[email protected],[email protected],.....

使用Spring Boot ,你可以像这样写(索引从0开始):

email.sendTo[0][email protected]
email.sendTo[1][email protected]
email.sendTo[2][email protected]

并像这样使用它:

@Component
@ConfigurationProperties("email")
public class EmailProperties {

    private List<String> sendTo;

    public List<String> getSendTo() {
        return sendTo;
    }

    public void setSendTo(List<String> sendTo) {
        this.sendTo = sendTo;
    }

}


@Component
public class EmailModel {

  @Autowired
  private EmailProperties emailProperties;

  //Use the sendTo List by 
  //emailProperties.getSendTo()

}



@Configuration
public class YourConfiguration {
    @Bean
  public EmailProperties emailProperties(){
        return new EmailProperties();
  }

}


#Put this in src/main/resource/META-INF/spring.factories
  org.springframework.boot.autoconfigure.EnableAutoConfiguration=example.compackage.YourConfiguration

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

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

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





spring-properties