SpringBoot使用yml配置文件

1. @Value("${變量名稱}")

使用@Value("${變量名稱}")是最簡單的一種形式
代碼中直接通過該方式引用即可

public class MicroGatewayConfig {
    @Value("${config}")
    private String config;
}

這種方式簡單粗暴,但是不推薦使用,

缺點很多
  1. idea也給我們報黃色的警告。而且我們不能再配置文件中按住“ctrl”鼠標(biāo)點擊配置變量直接跳到程序中。如果我們的項目中使用大量這樣的變量,將會是災(zāi)難。
  2. 最致命的問題是程序中變量獲取到的值只能是字符串,不能支持?jǐn)?shù)字,布爾類型。
  3. 使用這種形式,變量的值只會在SpringBoot啟動的時候賦值一次,以后不會改變,如果我們使用了配置中心,隨后,我們即使更新了配置中心中配置信息的值,程序也不會同步,除非我們重啟項目,配置中心就顯得比較尷尬。


2.1 配置類

@Setter
@Getter
@Component
@ConfigurationProperties("spring.cloud.gateway.custom")
public class MicroGatewayConfig {
    /**
     * config demo
     */
    private String config;
}

@ConfigurationProperties注解內(nèi)容填寫的是這個配置變量的前綴
這樣配置信息就以類的形成呈現(xiàn)出來,如果我們需要使用配置信息,直接通過@Resource注入即可。在配置文件中,也不會報警告,在編寫配置信息的時候,強(qiáng)大的idea也會幫我們聯(lián)想。

2.2 配置類嵌套

當(dāng)我們的配置信息越來越多時,需要針對不同的配置進(jìn)行分類,如果全部編寫在同一個配置類中,那么這個配置類會顯得十分臃腫。
springBoot支持配置類嵌套的形式。

舉個例子
我現(xiàn)在網(wǎng)關(guān)通過配置文件中的“開關(guān)”決定是否對請求信息進(jìn)行緩存。
這樣,我們可以將關(guān)于請求緩存相關(guān)的配置信息單獨一個類進(jìn)行保存。

  1. 緩存配置類
@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;
}
  1. 主配置類
@Setter
@Getter
@Component
@ConfigurationProperties("spring.cloud.gateway.custom")
public class MicroGatewayConfig {
    private CacheRequestConfig cacheRequest;
}
  1. 配置文件


    image.png

    我們在編寫配置類的時候,可以發(fā)現(xiàn)一個有趣的事情,就是針對于布爾類型,我們除了使用true/false外,還可以使用on/off進(jìn)行代替,在程序中springBoot會自動替我們轉(zhuǎn)換成true/false。這樣增強(qiáng)了配置的可讀性。

2.3 List配置信息

我們在配置信息中有時候可能需要配置一個list,比如配置redis的集群ip信息。之前我們可以使用一個字符串代替,每個ip中間使用特定的符號隔開,然后在程序中自己手動的去分隔。

強(qiáng)大的yml支持List,表達(dá)形式是每個元素前面使用“-”+空格
eg:
配置一個redis集群列表

  1. 配置類
@Data
@Component
@ConfigurationProperties("spring.cloud.gateway.custom")
public class MicroGatewayConfig {

    private CacheRequestConfig cacheRequest;

    private List<String> redisClusterPortList;
}
  1. 配置信息
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適用于未知的鍵值對,聽起來可能有點奇怪,舉個例子,加入我們想編寫一個header校驗器,但是我們校驗的內(nèi)容需要具體的場景來定義,但是校驗的規(guī)則已經(jīng)制定好了,這里說一下我指定的校驗規(guī)則。key 即為header的key,value為header的value,如果value的值可以是多個值中的任意一個,那么用“|”隔開,如果header的值可以為任意,但是不能為空,那么value的值不寫即可。

eg:
這里有三個header的值,分別是version,固定值為:1.0.0,platform是ios或者android都可以,diviceNo為任意值。那么具體的配置如下:

header:
  version: 1.0.0
  platform: iso|android
  diviceNo:  

進(jìn)階用法:

1. 為配置添加候選值

需求:
假設(shè)我這里有性別這個配置,候選值分別為man和woman

候選值依賴于枚舉實現(xiàn),我們需要編寫一個枚舉類

public enum Sex {
    man,
    woman
}

配置類

@Data
@Component
@ConfigurationProperties(prefix = "user")
public class UserConfiguration {
    /**
     * 用戶性別
     */
    private Sex sex;
}

2.為配置添加默認(rèn)值

還是上面的例子,如果我們配置用戶性別,默認(rèn)是man,我們只需要在配置類寫默認(rèn)值即可

@Data
@Component
@ConfigurationProperties(prefix = "user")
public class UserConfiguration {
    /**
     * 用戶性別,默認(rèn)man
     */
    private Sex sex = Sex.man;
}

3. map的高階用法

用過feign的朋友都知道,feign可以針對每個服務(wù)進(jìn)行配置,而且配置的時候還有提示信息,如下:

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<>();

可以看出他存儲配置類的方式是采用map,我們的服務(wù)名即為map的key,配置信息即為map的value

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容