前言
任何一個(gè)項(xiàng)目不可能少得了配置文件, 所以配置文件在spring-boot中有很多呈現(xiàn)方式湾蔓,本篇主要介紹一下最常用的配置文件的方式瘫析,代碼依附于第一篇開(kāi)發(fā)的簡(jiǎn)單Hello World的微服務(wù),并且項(xiàng)目代碼也是和第一篇的代碼在同一個(gè)項(xiàng)目之中默责。
常規(guī)配置
- 最常用的
key-value
形式的配置就是通過(guò)@Value
注解
假設(shè)配置文件 application.yaml里面的內(nèi)容為
key1: value1
key2: ${value2:default_value2}
然后代碼中使用了
@Value("${key1}")
private String key1;
@Value("${key2}")
private String key2;
@Value("${key3:default_value3}")
private String key3;
對(duì)于配置文件里面的key1
表示,對(duì)應(yīng)的值是value1
, 如果使用@Value("${key1}")
的時(shí)候沒(méi)有找到對(duì)應(yīng)的值程序就會(huì)拋出異常退出杖虾。
對(duì)于配置文件里面的key2
表示奇适,對(duì)應(yīng)的值是default_value2
, 但是可以支持通過(guò)手動(dòng)設(shè)置java啟動(dòng)參數(shù)-Dvalue2
來(lái)設(shè)置value2
來(lái)改變默認(rèn)值芦鳍。
對(duì)于 @Value("${key3:default_value3}")
表示試圖去找配置文件中的 key3
, 如果找到了就用配置文件中的值柠衅,沒(méi)有找到的話,不會(huì)拋出異常贷祈,而是用 default_value3
替代势誊。
- 把配置文件轉(zhuǎn)成對(duì)象
首先在配置類(lèi)上面使用注解
@Configuration
@EnableConfigurationProperties({
CollectionConfig.class, QiNiuConfig.class
})
其中注解 @Configuration
表示這個(gè)類(lèi)為配置類(lèi)谣蠢,需要讀配置文件,@EnableConfigurationProperties
表示需要可以把配置文件映射成 CollectionConfig
和 QiNiuConfig
類(lèi)的對(duì)象挤忙,是符合java的面向?qū)ο蟮乃枷氲摹?/p>
(1) 對(duì)象類(lèi)型: 下面是QiNiuConfig
類(lèi)
@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;
}
對(duì)應(yīng)的配置文件
qiniuParam:
accessKey: testAccessKey
secretKey: testSecretKey
localImageFilePath: /data/localUpdateFile/
otherParam1: 11111
在spring-boot的1.5.x版本里面饭玲,加入了對(duì)于配置對(duì)象的字段進(jìn)行了驗(yàn)證的功能茄厘,我們?cè)陬?lèi)上面加上@Validated
注解次哈, 然后在字段上面增加@NotNull
表示該字段不能為空吆录,也可以增加其他注解, 進(jìn)行各種參數(shù)規(guī)則的校驗(yàn)哀卫,然后@ConfigurationProperties
注解表示前綴統(tǒng)一撬槽,可以看到我們配置文件中的對(duì)象都是屬于 qiniuParam
域之下的侄柔,所以我們加了prefix=qiniuParam
,另外還有一點(diǎn)要注意移剪,@NotNull
注解薪者,在java的原生類(lèi)型的時(shí)候是不會(huì)生效的,可以看到配置文件中 otherParam2
并沒(méi)有賦值赶站,但是啟動(dòng)不會(huì)出錯(cuò)纺念,他會(huì)默認(rèn)把原生類(lèi)型 int
賦值成0, 如果把 int
改成了 Integer
烙博,啟動(dòng)就會(huì)出錯(cuò)。
(2) 集合類(lèi)型
配置文件
list:
- list_value1
- list_value2
- list_value3
map:
map_key1: map_value1
map_key2: map_value2
集合類(lèi)型不能用@Value
進(jìn)行注入铺根,必須要通過(guò)類(lèi)對(duì)象進(jìn)行構(gòu)造
@Validated
@ConfigurationProperties
public class CollectionConfig {
@NotNull
private List<String> list;
@NotNull
private Map<String, String> map;
}
同樣可以增加參數(shù)驗(yàn)證注解來(lái)配合進(jìn)行驗(yàn)證乔宿。并且注意,配置文件只支持list
類(lèi)型和map
類(lèi)型的配置參數(shù)掂林。
(3) 其他
如果一定要利用@Value
來(lái)接受list
參數(shù)泻帮,可以通過(guò)利用 @Value
注解的表達(dá)式函數(shù)進(jìn)行解析
@Value("#{'${list}'.split(',')}")
private List<String> list;
@Value("#{${map}}")
private Map<String,String> map;
然后配置文件中寫(xiě)成
list: topic1,topic2,topic3
map: "{key1: 'value1', key2: 'value2'}"
ps: 注意上面的map解析中计寇,一定要用""把map所對(duì)應(yīng)的value包起來(lái),要不然解析會(huì)失敗元莫,導(dǎo)致不能轉(zhuǎn)成 Map<String,String> map;
對(duì)象蝶押。