1. @Value("${變量名稱(chēng)}")
使用@Value("${變量名稱(chēng)}")是最簡(jiǎn)單的一種形式
代碼中直接通過(guò)該方式引用即可
public class MicroGatewayConfig {
@Value("${config}")
private String config;
}
這種方式簡(jiǎn)單粗暴府适,但是不推薦使用汉规,
缺點(diǎn)很多
- idea也給我們報(bào)黃色的警告诊沪。而且我們不能再配置文件中按住“ctrl”鼠標(biāo)點(diǎn)擊配置變量直接跳到程序中秦躯。如果我們的項(xiàng)目中使用大量這樣的變量郑叠,將會(huì)是災(zāi)難。
- 最致命的問(wèn)題是程序中變量獲取到的值只能是字符串产禾,不能支持?jǐn)?shù)字排作,布爾類(lèi)型。
-
使用這種形式亚情,變量的值只會(huì)在SpringBoot啟動(dòng)的時(shí)候賦值一次妄痪,以后不會(huì)改變,如果我們使用了配置中心楞件,隨后衫生,我們即使更新了配置中心中配置信息的值,程序也不會(huì)同步土浸,除非我們重啟項(xiàng)目罪针,配置中心就顯得比較尷尬。
2.1 配置類(lèi)
@Setter
@Getter
@Component
@ConfigurationProperties("spring.cloud.gateway.custom")
public class MicroGatewayConfig {
/**
* config demo
*/
private String config;
}
@ConfigurationProperties
注解內(nèi)容填寫(xiě)的是這個(gè)配置變量的前綴
這樣配置信息就以類(lèi)的形成呈現(xiàn)出來(lái)黄伊,如果我們需要使用配置信息泪酱,直接通過(guò)@Resource
注入即可。在配置文件中还最,也不會(huì)報(bào)警告墓阀,在編寫(xiě)配置信息的時(shí)候,強(qiáng)大的idea也會(huì)幫我們聯(lián)想拓轻。
2.2 配置類(lèi)嵌套
當(dāng)我們的配置信息越來(lái)越多時(shí)岂津,需要針對(duì)不同的配置進(jìn)行分類(lèi),如果全部編寫(xiě)在同一個(gè)配置類(lèi)中悦即,那么這個(gè)配置類(lèi)會(huì)顯得十分臃腫吮成。
springBoot支持配置類(lèi)嵌套的形式。
舉個(gè)例子
我現(xiàn)在網(wǎng)關(guān)通過(guò)配置文件中的“開(kāi)關(guān)”決定是否對(duì)請(qǐng)求信息進(jìn)行緩存辜梳。
這樣粱甫,我們可以將關(guān)于請(qǐng)求緩存相關(guān)的配置信息單獨(dú)一個(gè)類(lèi)進(jìn)行保存。
- 緩存配置類(lèi)
@Data
@Component
@ConfigurationProperties("spring.cloud.gateway.custom.cache-request")
public class CacheRequestConfig {
/**
* 是否緩存body信息
*/
private Boolean body = false;
/**
* 是否緩存表單信息
*/
private Boolean formData = false;
/**
* 是否緩存encodeBody信息
*/
private Boolean encodeFormData = false;
}
- 主配置類(lèi)
@Setter
@Getter
@Component
@ConfigurationProperties("spring.cloud.gateway.custom")
public class MicroGatewayConfig {
private CacheRequestConfig cacheRequest;
}
-
配置文件
我們?cè)诰帉?xiě)配置類(lèi)的時(shí)候作瞄,可以發(fā)現(xiàn)一個(gè)有趣的事情茶宵,就是針對(duì)于布爾類(lèi)型,我們除了使用true/false外宗挥,還可以使用on/off進(jìn)行代替乌庶,在程序中springBoot會(huì)自動(dòng)替我們轉(zhuǎn)換成true/false种蝶。這樣增強(qiáng)了配置的可讀性。
2.3 List配置信息
我們?cè)谂渲眯畔⒅杏袝r(shí)候可能需要配置一個(gè)list瞒大,比如配置redis的集群ip信息螃征。之前我們可以使用一個(gè)字符串代替,每個(gè)ip中間使用特定的符號(hào)隔開(kāi)透敌,然后在程序中自己手動(dòng)的去分隔盯滚。
強(qiáng)大的yml支持List,表達(dá)形式是每個(gè)元素前面使用“-”+空格
eg:
配置一個(gè)redis集群列表
- 配置類(lèi)
@Data
@Component
@ConfigurationProperties("spring.cloud.gateway.custom")
public class MicroGatewayConfig {
private CacheRequestConfig cacheRequest;
private List<String> redisClusterPortList;
}
- 配置信息
spring:
cloud:
gateway:
custom:
cache-request:
body: true
form-data: true
encode-form-data: on
redisClusterHostList:
- 192.168.1.1
- 196.168.1.0
2.3 Map配置信息
yml使用map的格式為:
map變量名
key: value
key: value
map適用于未知的鍵值對(duì)酗电,聽(tīng)起來(lái)可能有點(diǎn)奇怪魄藕,舉個(gè)例子,加入我們想編寫(xiě)一個(gè)header校驗(yàn)器撵术,但是我們校驗(yàn)的內(nèi)容需要具體的場(chǎng)景來(lái)定義背率,但是校驗(yàn)的規(guī)則已經(jīng)制定好了,這里說(shuō)一下我指定的校驗(yàn)規(guī)則嫩与。key 即為header的key,value為header的value退渗,如果value的值可以是多個(gè)值中的任意一個(gè),那么用“|”隔開(kāi)蕴纳,如果header的值可以為任意,但是不能為空个粱,那么value的值不寫(xiě)即可古毛。
eg:
這里有三個(gè)header的值,分別是version,固定值為:1.0.0都许,platform是ios或者android都可以稻薇,diviceNo為任意值。那么具體的配置如下:
header:
version: 1.0.0
platform: iso|android
diviceNo:
進(jìn)階用法:
1. 為配置添加候選值
需求:
假設(shè)我這里有性別這個(gè)配置胶征,候選值分別為man和woman
候選值依賴(lài)于枚舉實(shí)現(xiàn)塞椎,我們需要編寫(xiě)一個(gè)枚舉類(lèi)
public enum Sex {
man,
woman
}
配置類(lèi)
@Data
@Component
@ConfigurationProperties(prefix = "user")
public class UserConfiguration {
/**
* 用戶(hù)性別
*/
private Sex sex;
}
2.為配置添加默認(rèn)值
還是上面的例子,如果我們配置用戶(hù)性別睛低,默認(rèn)是man案狠,我們只需要在配置類(lèi)寫(xiě)默認(rèn)值即可
@Data
@Component
@ConfigurationProperties(prefix = "user")
public class UserConfiguration {
/**
* 用戶(hù)性別,默認(rèn)man
*/
private Sex sex = Sex.man;
}
3. map的高階用法
用過(guò)feign的朋友都知道钱雷,feign可以針對(duì)每個(gè)服務(wù)進(jìn)行配置骂铁,而且配置的時(shí)候還有提示信息,如下:
feign:
client:
config:
default:
connectTimeout: 1000
readTimeout: 1000
user-servce:
connectTimeout: 5000
readTimeout: 5000
order-service:
connectTimeout: 3000
readTimeout: 3000
feign配置文件部分代碼如下:
@ConfigurationProperties("feign.client")
public class FeignClientProperties {
private boolean defaultToProperties = true;
private String defaultConfig = "default";
private Map<String, FeignClientConfiguration> config = new HashMap<>();
可以看出他存儲(chǔ)配置類(lèi)的方式是采用map罩抗,我們的服務(wù)名即為map的key拉庵,配置信息即為map的value