天天看點

Spring Boot2 系列教程(五)Spring Boot中的 yaml 配置

搞 Spring Boot 的小夥伴都知道,Spring Boot 中的配置檔案有兩種格式,properties 或者 yaml,一般情況下,兩者可以随意使用,選擇自己順手的就行了,那麼這兩者完全一樣嗎?肯定不是啦!本文就來和大夥重點介紹下 yaml 配置,最後再來看看 yaml 和 properties 配置有何差別。

狡兔三窟

首先 application.yaml 在 Spring Boot 中可以寫在四個不同的位置,分别是如下位置:

  1. 項目根目錄下的 config 目錄中
  2. 項目根目錄下
  3. classpath 下的 config 目錄中
  4. classpath 目錄下

四個位置中的 application.yaml 檔案的優先級按照上面列出的順序依次降低。即如果有同一個屬性在四個檔案中都出現了,以優先級高的為準。

那麼 application.yaml 是不是必須叫 application.yaml 這個名字呢?當然不是必須的。開發者可以自己定義 yaml 名字,自己定義的話,需要在項目啟動時指定配置檔案的名字,像下面這樣:

當然這是在 IntelliJ IDEA 中直接配置的,如果項目已經打成 jar 包了,則在項目啟動時加入如下參數:

java -jar myproject.jar --spring.config.name=app
           

這樣配置之後,在項目啟動時,就會按照上面所說的四個位置按順序去查找一個名為 app.yaml 的檔案。當然這四個位置也不是一成不變的,也可以自己定義,有兩種方式,一個是使用

spring.config.location

屬性,另一個則是使用

spring.config.additional-location

這個屬性,在第一個屬性中,表示自己重新定義配置檔案的位置,項目啟動時就按照定義的位置去查找配置檔案,這種定義方式會覆寫掉預設的四個位置,也可以使用第二種方式,第二種方式則表示在四個位置的基礎上,再添加幾個位置,新添加的位置的優先級大于原本的位置。

配置方式如下:

這裡要注意,配置檔案位置時,值一定要以

/

結尾。

數組注入

yaml 也支援數組注入,例如

my:
  servers:
	- dev.example.com
	- another.example.com
           

這段資料可以綁定到一個帶 Bean 的數組中:

@ConfigurationProperties(prefix="my")
@Component
public class Config {

	private List<String> servers = new ArrayList<String>();

	public List<String> getServers() {
		return this.servers;
	}
}
           

項目啟動後,配置中的數組會自動存儲到 servers 集合中。當然,yaml 不僅可以存儲這種簡單資料,也可以在集合中存儲對象。例如下面這種:

redis:
  redisConfigs:
    - host: 192.168.66.128
      port: 6379
    - host: 192.168.66.129
      port: 6380
           

這個可以被注入到如下類中:

@Component
@ConfigurationProperties(prefix = "redis")
public class RedisCluster {
    private List<SingleRedisConfig> redisConfigs;
	//省略getter/setter
}
           

優缺點

不同于 properties 檔案的無序,yaml 配置是有序的,這一點在有些配置中是非常有用的,例如在 Spring Cloud Zuul 的配置中,當我們配置代理規則時,順序就顯得尤為重要了。當然 yaml 配置也不是萬能的,例如,yaml 配置目前不支援 @PropertySource 注解。

1、

2、

3、

4、