前言
任何一个项目不可能少得了配置文件, 所以配置文件在spring-boot中有很多呈现方式,本篇主要介绍一下最常用的配置文件的方式,代码依附于第一篇开发的简单Hello World的微服务,并且项目代码也是和第一篇的代码在同一个项目之中。
常规配置
- 最常用的
key-value
形式的配置就是通过@Value
注解
假设配置文件 application.yaml里面的内容为
key1: value1
key2: ${value2:default_value2}
然后代码中使用了
@Value("${key1}")
private String key1;
@Value("${key2}")
private String key2;
@Value("${key3:default_value3}")
private String key3;
对于配置文件里面的key1
表示,对应的值是value1
, 如果使用@Value("${key1}")
的时候没有找到对应的值程序就会抛出异常退出。
对于配置文件里面的key2
表示,对应的值是default_value2
, 但是可以支持通过手动设置java启动参数-Dvalue2
来设置value2
来改变默认值。
对于 @Value("${key3:default_value3}")
表示试图去找配置文件中的 key3
, 如果找到了就用配置文件中的值,没有找到的话,不会抛出异常,而是用 default_value3
替代。
- 把配置文件转成对象
首先在配置类上面使用注解
@Configuration
@EnableConfigurationProperties({
CollectionConfig.class, QiNiuConfig.class
})
其中注解 @Configuration
表示这个类为配置类,需要读配置文件,@EnableConfigurationProperties
表示需要可以把配置文件映射成 CollectionConfig
和 QiNiuConfig
类的对象,是符合java的面向对象的思想的。
(1) 对象类型: 下面是QiNiuConfig
类
@Validated
@ConfigurationProperties(prefix = "qiniuParam")
public class QiNiuConfig {
@NotNull
private String accessKey;
@NotNull
private String secretKey;
private String localImageFilePath;
private int otherParam1;
@NotNull
private int otherParam2;
// @NotNull
private Integer otherParam3;
}
对应的配置文件
qiniuParam:
accessKey: testAccessKey
secretKey: testSecretKey
localImageFilePath: /data/localUpdateFile/
otherParam1: 11111
在spring-boot的1.5.x版本里面,加入了对于配置对象的字段进行了验证的功能,我们在类上面加上@Validated
注解, 然后在字段上面增加@NotNull
表示该字段不能为空,也可以增加其他注解, 进行各种参数规则的校验,然后@ConfigurationProperties
注解表示前缀统一,可以看到我们配置文件中的对象都是属于 qiniuParam
域之下的,所以我们加了prefix=qiniuParam
,另外还有一点要注意,@NotNull
注解,在java的原生类型的时候是不会生效的,可以看到配置文件中 otherParam2
并没有赋值,但是启动不会出错,他会默认把原生类型 int
赋值成0, 如果把 int
改成了 Integer
,启动就会出错。
(2) 集合类型
配置文件
list:
- list_value1
- list_value2
- list_value3
map:
map_key1: map_value1
map_key2: map_value2
集合类型不能用@Value
进行注入,必须要通过类对象进行构造
@Validated
@ConfigurationProperties
public class CollectionConfig {
@NotNull
private List<String> list;
@NotNull
private Map<String, String> map;
}
同样可以增加参数验证注解来配合进行验证。并且注意,配置文件只支持list
类型和map
类型的配置参数。
(3) 其他
如果一定要利用@Value
来接受list
参数,可以通过利用 @Value
注解的表达式函数进行解析
@Value("#{'${list}'.split(',')}")
private List<String> list;
@Value("#{${map}}")
private Map<String,String> map;
然后配置文件中写成
list: topic1,topic2,topic3
map: "{key1: 'value1', key2: 'value2'}"
ps: 注意上面的map解析中,一定要用""把map所对应的value包起来,要不然解析会失败,导致不能转成 Map<String,String> map;
对象。