天天看點

SpringBoot配置檔案格式—properties和yml

作者:尚矽谷教育

在SpringBoot架構中,提供了兩種不同格式的配置檔案,一個是properties,另一個是yaml(也叫做yml)。雖然properties檔案比較常見,但是相對于properties而言,yaml更加簡潔明了,而且使用的場景也更多,很多開源項目都是使用 yaml進行配置。除了簡潔,yaml還有另外一個特點,就是yaml中的資料是有序的,properties中的資料是無序的,在一些需要路徑比對的配置中,順序就顯得尤為重要(例如我們在SpringCloud-Zuul中的配置),此時我們一般采用yaml。

一、properties配置說明

1.1properties檔案位置說明

首先,當我們建立一個SpringBoot工程時,預設resources目錄下就有一個application.properties檔案,可以在application.properties檔案中進行項目配置,但是這個檔案并非唯一的配置檔案,在SpringBoot中,一共有4個地方可以存放application.properties檔案。

目前項目根目錄下的config目錄下;

目前項目的根目錄下;

resources目錄下的config目錄下;

resources目錄下;

按如上順序,四個配置檔案的優先級依次降低。如下:

SpringBoot配置檔案格式—properties和yml

這四個位置是預設位置,即SpringBoot啟動,預設會從這四個位置按順序去查找相關屬性并加載。但是,這也不是絕對的,我們也可以在項目啟動時自定義配置檔案位置。

例如,在resources目錄下建立一個javaboy目錄,目錄中存放一個application.properties檔案,那麼正常情況下,當我們啟動SpringBoot項目時,這個配置檔案是不會被自動加載的。

我們可以通過spring.config.location屬性來手動的指定配置檔案位置,指定完成後,系統就會自動去指定目錄下查找application.properties檔案。

SpringBoot配置檔案格式—properties和yml

此時,啟動項目就會發現,項目以classpath:/javaboy/application.propertie配置檔案啟動。這是在開發工具中配置了啟動位置,如果項目已經打包成 jar ,在啟動指令中加入位置參數即可:

java -jar properties-0.0.1-SNAPSHOT.jar -- spring.config.location=classpath:/javaboy/

1.2properties檔案名說明

對于application.properties而言,它不一定非要叫application,但是項目預設是去加載名為application的配置檔案,如果我們的配置檔案不叫application,也是可以的,但是,需要明确指定配置檔案的檔案名。方式和指定路徑一緻,隻不過此時的key是 spring.config.name 。

首先我們在resources目錄下建立一個app.properties檔案,然後在 IDEA 中指定。配置檔案的檔案名:

SpringBoot配置檔案格式—properties和yml

指定完配置檔案名之後,再次啟動項目,此時系統會自動去預設的四個位置下面分别查找名為app.properties的配置檔案。當然,允許自定義檔案名的配置檔案不放在四個預設位置,而是放在自定義目錄下,此時就需要明确指定 spring.config.location 。

注意:配置檔案位置和檔案名稱可以同時自定義。

1.3properties檔案配置内容解析

普通屬性注入

由于SpringBoot源自Spring架構,是以Spring中存在的屬性注入,在SpringBoot中一樣也存在。由于SpringBoot中,預設會自動加載application.properties檔案, 是以簡單的屬性注入可以直接在這個配置檔案中寫。

例如,現在定義一個 Book 類:

public class Book {

private Long id;

private String name;

private String author;

//省略 getter/setter

}

然後,在application.properties檔案中定義屬性:

book.name=三國演義

book.author=羅貫中

book.id=1

按照傳統的方式(Spring中的方式),可以直接通過 @Value 注解将這些屬性注入到 Book 對象中:

@Component

public class Book {

@Value("${book.id}")

private Long id;

@Value("${book.name}")

private String name;

@Value("${book.author}")

private String author;

//省略 getter/setter

}

注意 :

Book對象本身也要交給Spring容器去管理,如果Book沒有交給Spring容器,那麼Book中的屬性也無法從Spring容器中擷取到值。配置完成後,在Controller或者單元測試中注入Book對象,啟動項目,就可以看到屬性已經注入到對象中了。

一般來說,我們在application.properties檔案中主要存放系統配置,這種自定義配置不建議放在該檔案中,可以自定義properties檔案來存在自定義配置。

例如在 resources 目錄下,自定義book.properties檔案,内容如下:

book.name=三國演義

book.author=羅貫中

book.id=1

此時,項目啟動并不會自動的加載該配置檔案,如果是在 XML 配置中,可以通過如下方式引用該properties檔案:

<context:property-placeholder location="classpath:book.properties"/>

如果是在Java配置中,可以通過@PropertySource來引入配置:

@Component

@PropertySource("classpath:book.properties")

public class Book {

@Value("${book.id}")

private Long id;

@Value("${book.name}")

private String name;

@Value("${book.author}")

private String author;

//getter/setter

}

這樣,當項目啟動時,就會自動加載book.properties檔案。

類型安全的屬性注入

SpringBoot引入了類型安全的屬性注入,如果采用Spring中的配置方式,當配置的屬性非常多的時候,工作量就很大了,而且容易出錯。使用類型安全的屬性注入,可以有效的解決這個問題。

@Component

@PropertySource("classpath:book.properties")

@ConfigurationProperties(prefix = "book")

public class Book {

private Long id;

private String name;

private String author;

//省略 getter/setter

}

這裡,主要是引入@ConfigurationProperties(prefix = "book") 注解,并且配置了屬性的字首,此時會自動将Spring容器中對應的資料注入到對象對應的屬性中,就不用通過@Value注解挨個注入了,減少工作量并且避免出錯。

二、yml配置說明

1.1yml檔案位置說明

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

項目根目錄下的config目錄中;

項目根目錄下;

classpath下的config目錄中;

classpath目錄下;

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

那麼application.yaml是不是必須叫application.yaml這個名字呢?

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

SpringBoot配置檔案格式—properties和yml

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

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

這樣配置之後,在項目啟動時,就會按照上面所說的四個位置按順序去查找一個名為app.yaml的檔案。

當然這四個位置也不是一成不變的,也可以自己定義,有兩種方式:

一個是使用spring.config.location屬性;

另一個是使用spring.config.additional-location屬性;

在第一個屬性中,表示自己重新定義配置檔案的位置,項目啟動時就按照定義的位置去查找配置檔案,這種定義方式會覆寫掉默 認的四個位置。

也可以使用第二種方式,第二種方式則表示在四個位置的基礎上,再添加幾個位置,新添加的位置的優先級大于原本的位置。

配置方式如下:

SpringBoot配置檔案格式—properties和yml

注意:這裡配置檔案位置時,值一定要以 / 結尾。

1.2yml檔案配置内容解析

數組注入

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.200.129

port: 6379

- host: 192.168.200.129

port: 6380

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

@Component

@ConfigurationProperties(prefix = "redis")

public class RedisCluster {

private List<SingleRedisConfig> redisConfigs;

//省略 getter/setter

}

三、properties和yml檔案加載優先級說明

上面的内容介紹中,有說到配置檔案加載的優先級問題,下面就通過源碼來看下配置檔案具體的加載順序。我們知道springboot項目的入口在其啟動類中,主要就是run方法配合啟動類上相關注解來完成。

1.1properties和yml加載順序優先級說明

首先基于自動配置,我們知道springboot項目啟動時,會優先加載springboot核心jar包下META-INF檔案夾下的spring.factories檔案。而在spring.factories檔案中首先配置了配置檔案的加載順序,我們可以看到配置資源的加載是properties檔案優先于yml檔案。

SpringBoot配置檔案格式—properties和yml

其中PropertiesPropertySourceLoader類中定義了擴充名為properties、xml的檔案。

SpringBoot配置檔案格式—properties和yml

而YamlPropertySourceLoader類中定義了擴充名為yml、yaml的檔案。

SpringBoot配置檔案格式—properties和yml

對于同一位置上,properties檔案的優先級高于yml。

上述說明了properteis和yml檔案的加載順序優先級之後,接下來咱們就重點來看下對于不同位置的配置檔案,它們的加載順序是怎麼樣的。

1.2不同位置配置檔案加載順序優先級說明

對于不同位置的配置檔案,它們的加載順序其實springboot的ConfigFileApplicationListener類中是有說明的。

SpringBoot配置檔案格式—properties和yml

該類已在spring.factories中配置,當springboot項目啟動時就會加載。而在ConfigFileApplicationListener類中,則定義了配置檔案加載順序的方法。

SpringBoot配置檔案格式—properties和yml

在ConfigFileApplicationListener類中,我們重點看一個方法getSearchLocations方法。

SpringBoot配置檔案格式—properties和yml

結論:

大家可以發現上述截圖中傳回Set類型的locations對象中,對應索引位置的值和ConfigFileApplicationListener類上注釋中說明的不同位置的配置檔案的加載順序是一緻的。

1.3bootstrap、application配置檔案說明

其實在springboot架構中,還有一個配置檔案,它的字首是指定好的,叫做bootstrap。

它分為bootstrap.yml和bootstrap.properties。在我們做項目時,如果我們要使用bootstrap,那麼建議我們至少統一字尾後在使用。

比如:bootstrap.yml、application.yml

或者 bootstrap.properties、application.properties。

其中bootstrap.yml或者bootstrap.properties配置檔案主要在程式引導時執行,它的加載應用于更加早期配置資訊讀取。

而application.yml或者application.properties配置檔案是應用程式特有配置資訊,主要用來配置子產品中需使用的公共參數。

總結

application.properties是SpringBoot中配置的一個重要載體,很多元件的屬性都可以在這裡定制。

它的用法和yaml 比較類似。關于yaml配置,它的檔案位置和檔案名是和properties一樣的,我們隻需要将properties檔案的字尾名稱由.properties改為.yml或者.yaml即可。在使用上properties檔案是采用k=v格式來配置,yaml檔案則是有嚴格的文法格式規則,我們按照規則去配置即可。

繼續閱讀