一文讀懂 Spring Boot 配置文件 application.properties !

 

在 Spring Boot 中,配置文件有兩種不一樣的格式,一個是 properties ,另外一個是 yaml 。php

雖然 properties 文件比較常見,可是相對於 properties 而言,yaml 更加簡潔明瞭,並且使用的場景也更多,不少開源項目都是使用 yaml 進行配置(例如 Hexo)。除了簡潔,yaml 還有另一個特色,就是 yaml 中的數據是有序的,properties 中的數據是無序的,在一些須要路徑匹配的配置中,順序就顯得尤其重要(例如咱們在 Spring Cloud Zuul 中的配置),此時咱們通常採用 yaml。java

本文主要來看看 properties 的問題。git

位置問題

首先,當咱們建立一個 Spring Boot 工程時,默認 resources 目錄下就有一個 application.properties 文件,能夠在 application.properties 文件中進行項目配置,可是這個文件並不是惟一的配置文件,在 Spring Boot 中,一共有 4 個地方能夠存放 application.properties 文件。github

•當前項目根目錄下的 config 目錄下•當前項目的根目錄下•resources 目錄下的 config 目錄下•resources 目錄下spring

按如上順序,四個配置文件的優先級依次下降。以下:安全

640?wx_fmt=png

這四個位置是默認位置,即 Spring Boot 啓動,默認會從這四個位置按順序去查找相關屬性並加載。可是,這也不是絕對的,咱們也能夠在項目啓動時自定義配置文件位置。app

例如,如今在 resources 目錄下建立一個 javaboy 目錄,目錄中存放一個 application.properties 文件,那麼正常狀況下,當咱們啓動 Spring Boot 項目時,這個配置文件是不會被自動加載的。咱們能夠經過 spring.config.location 屬性來手動的指定配置文件位置,指定完成後,系統就會自動去指定目錄下查找 application.properties 文件。ide

640?wx_fmt=png

此時啓動項目,就會發現,項目以 classpath:/javaboy/application.propertie 配置文件啓動。工具

這是在開發工具中配置了啓動位置,若是項目已經打包成 jar ,在啓動命令中加入位置參數便可:單元測試

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

文件名問題

對於 application.properties 而言,它不必定非要叫 application ,可是項目默認是去加載名爲 application 的配置文件,若是咱們的配置文件不叫 application ,也是能夠的,可是,須要明確指定配置文件的文件名。

方式和指定路徑一致,只不過此時的 key 是 spring.config.name 。

首先咱們在 resources 目錄下建立一個 app.properties 文件,而後在 IDEA 中指定配置文件的文件名:

640?wx_fmt=png

指定完配置文件名以後,再次啓動項目,此時系統會自動去默認的四個位置下面分別查找名爲 app.properties 的配置文件。固然,容許自定義文件名的配置文件不放在四個默認位置,而是放在自定義目錄下,此時就須要明確指定 spring.config.location 。

配置文件位置和文件名稱能夠同時自定義。

普通的屬性注入

因爲 Spring Boot 源自 Spring ,因此 Spring 中存在的屬性注入,在 Spring Boot 中同樣也存在。因爲 Spring Boot 中,默認會自動加載 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 文件。

這只是 Spring 中屬性注入的一個簡單用法,和 Spring Boot 沒有任何關係。

類型安全的屬性注入

Spring Boot 引入了類型安全的屬性注入,若是採用 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 註解挨個注入了,減小工做量而且避免出錯。

總結

application.properties 是 Spring Boot 中配置的一個重要載體,不少組件的屬性均可以在這裏定製。它的用法和 yaml 比較相似,關於 yaml 配置,你們能夠參考 Spring Boot 中的 yaml 配置簡介 。

本文案例我已上傳到 GitHub:https://github.com/lenve/javaboy-code-samples

 

640?wx_fmt=png

相關文章
相關標籤/搜索