Spring Boot中的配置文件使用以及重新加载
概要
本教程将展示如何通过Java configuration和@PropertySource或XML和property-placeholder在Spring中设置和使用属性
通过Java Annotations注册配置文件
Spring 3.1起引入了新的@PropertySource注释,作为向环境中添加属性源的方便机制。
该注释将与基于java的配置和@Configuration注释一起使用:
@Configuration
@PropertySource("classpath:foo.properties")
public class PropertiesWithJavaConfig {
//...
}
另一种非常有用的注册新属性文件的方法是使用占位符,它允许在运行时动态选择正确的文件:
@PropertySource({
"classpath:persistence-${envTarget:mysql}.properties"
})
${envTarget:mysql} , envTarget:环境变量名称 , mysql:默认值
定义多个属性文件
在Java 8中@PropertySource注释是可重复的。因此,我们可以使用这个注释来定义多个属性位置:
@PropertySource("classpath:foo.properties")
@PropertySource("classpath:bar.properties")
public class PropertiesWithJavaConfig {
//...
}
当然也可以使用数组的形式:
@PropertySources({
@PropertySource("classpath:foo.properties"),
@PropertySource("classpath:bar.properties")
})
public class PropertiesWithJavaConfig {
//...
}
注入属性值
- 用@Value注释注入属性很简单
@Value( "${jdbc.url}" )
private String jdbcUrl;
- 在注入的时候使用默认值
@Value( "${jdbc.url:aDefaultUrl}" )
private String jdbcUrl;
- 使用Environment API获取属性值
@Autowired
private Environment env;
...
dataSource.setUrl(env.getProperty("jdbc.url"));
@Value使用
@Value注解可用于将值注入spring管理bean中的字段,并且可以应用于字段或构造函数/方法参数级别。
- 注入硬编码值到字段中(没有任何意义)
@Value("string value")
private String stringValue;
- 使用@PropertySource注释允许我们使用@Value注释处理来自属性文件的值。在下面的例子中,我们从分配给字段的文件中获取值:
@Value("${value.from.file}")
private String valueFromFile;
- 我们也可以用相同的语法从系统属性中设置值,假设我们已经定义了一个系统属性systemValue:
@Value("${systemValue}")
private String systemValue;
- 可以为未定义的属性提供默认值。一些默认值将被注入:
@Value("${unknown.param:some default}")
private String someDefault;
如果将相同的属性定义为系统属性以及属性文件中,则将优先应用系统属性,系统属性 > 配置文件属性
- 数组属性设置
listOfValues = A,B,C
@Value("${listOfValues}")
private String[] valuesArray;
- map 属性设置
我们还可以使用@Value注释来注入一个Map属性。首先,我们需要在属性文件的{key: ’ value’}中定义属性:
valuesMap={key1: '1', key2: '2', key3: '3'}
@Value("#{${valuesMap}}")
private Map<String, Integer> valuesMap;
- 如果我们需要在映射中获取特定键的值,我们所要做的就是在表达式中添加键的名称:
@Value("#{${valuesMap}.key1}")
private Integer valuesMapKey1;
- 安全的使用表达式
@Value("#{${valuesMap}['unknownKey']}")
private Integer unknownMapKey;
- 为map设定默认值
@Value("#{${unknownMap : {key1: '1', key2: '2'}}}")
private Map<String, Integer> unknownMap;
@Value("#{${valuesMap}['unknownKey'] ?: 5}")
private Integer unknownMapKeyWithDefaultValue;
- 使用@Value注入所有的系统变量
@Value("#{systemProperties}")
private Map<String, String> systemPropertiesMap;
- 使用SpEL设置属性
@Component
@PropertySource("classpath:values.properties")
public class CollectionProvider {
private List<String> values = new ArrayList<>();
@Autowired
public void setValues(@Value("#{'${listOfValues}'.split(',')}") List<String> values) {
this.values.addAll(values);
}
// standard getter
}
Spring Boot 中配置属性
在Spring Boot工程目录src/main/resources中的application.properties会被自动加载,无需额外配置就可以使用
- 1、在运行的时候指定配置文件
java -jar app.jar --spring.config.location=classpath:/another-l