为什么要将信息放入配置文件中?
Java项目中难免有一些配置信息(例如服务器名称,地址和端口号等等),为了实现一套代码多处部署使用,需要将这些配置信息提取到配置文件,在程序运行的时候获取,省去了为不同系统维护不同代码的麻烦。
在Spring Boot项目中实现配置文件信息的获取
在Spring Boot项目中读取配置文件的信息主要有以下两个方式:
-
@Value
注解:适合读取单条的配置信息。 -
@ConfigurationProperties
注解:适合读取一组配置信息。
准备配置文件
假定我们需要在程序中使用如下的配置信息:
application.yml:
#Read by @Value
my:
name: Paul
#Read by @ConfigurationProperties
test:
string: Hello World
intValue: 10
booleanValue: false
list[0]: Hi
list[1]: Kate
list[2]: Mary
map.city: Sydney
map.street: George Street
nested.string: nested string
nested.intValue: 100
其中前缀为my的信息通过@Value
读取,前缀为test的信息通过@ConfigurationProperties
读取。
使用@value读取配置信息
@Value("${my.name:default}")
private String myName; //值为Paul
@Value注解的书写规则为:@Value("${属性名:默认值}")
。如果属性名在配置文件中不存在,则将默认值注入到变量中。
使用 @ConfigurationProperties 读取配置文件
依照例子中的自定义信息格式,编写其对应的Data Class如下:
@ConfigurationProperties(prefix = "test")
@Component
public class MyConfigBean {
private String string;
private int intValue;
private boolean booleanValue;
private List<String> list;
private Map<String, String> map;
private final Nested nested = new Nested();
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public int getIntValue() {
return intValue;
}
public void setIntValue(int intValue) {
this.intValue = intValue;
}
public boolean isBooleanValue() {
return booleanValue;
}
public void setBooleanValue(boolean booleanValue) {
this.booleanValue = booleanValue;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public Nested getNested() {
return nested;
}
static class Nested {
private String string;
private int intValue;
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public int getIntValue() {
return intValue;
}
public void setIntValue(int intValue) {
this.intValue = intValue;
}
}
}
需要使用这些配置的时候只需Autowire这个class即可:
@Autowire
private MyConfigBean myConfigBean;
public void test() {
String string = myConfigBean.getString(); // Hello World
int intValue = myConfigBean.getIntValue(); // 10
// ...
String nestedString = myConfigBean.getNested().getString(); // nested string
}
后续
对于更为复杂的属性文件解析,请阅读SpringBoot 复杂配置信息读取