在 Spring Boot 中,配置文件有兩種不一樣的格式,一個是 properties ,另外一個是 yaml 。java
雖然 properties 文件比較常見,可是相對於 properties 而言,yaml 更加簡潔明瞭,並且使用的場景也更多,不少開源項目都是使用 yaml 進行配置(例如 Hexo)。除了簡潔,yaml 還有另一個特色,就是 yaml 中的數據是有序的,properties 中的數據是無序的,在一些須要路徑匹配的配置中,順序就顯得尤其重要(例如咱們在 Spring Cloud Zuul 中的配置),此時咱們通常採用 yaml。關於 yaml ,鬆哥以前寫過一篇文章:Spring Boot 中的 yaml 配置簡介。git
本文主要來看看 properties 的問題。github
首先,當咱們建立一個 Spring Boot 工程時,默認 resources 目錄下就有一個 application.properties 文件,能夠在 application.properties 文件中進行項目配置,可是這個文件並不是惟一的配置文件,在 Spring Boot 中,一共有 4 個地方能夠存放 application.properties 文件。spring
按如上順序,四個配置文件的優先級依次下降。以下:後端
這四個位置是默認位置,即 Spring Boot 啓動,默認會從這四個位置按順序去查找相關屬性並加載。可是,這也不是絕對的,咱們也能夠在項目啓動時自定義配置文件位置。安全
例如,如今在 resources 目錄下建立一個 javaboy 目錄,目錄中存放一個 application.properties 文件,那麼正常狀況下,當咱們啓動 Spring Boot 項目時,這個配置文件是不會被自動加載的。咱們能夠經過 spring.config.location 屬性來手動的指定配置文件位置,指定完成後,系統就會自動去指定目錄下查找 application.properties 文件。app
此時啓動項目,就會發現,項目以 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 中指定配置文件的文件名:
指定完配置文件名以後,再次啓動項目,此時系統會自動去默認的四個位置下面分別查找名爲 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
好了,有問題歡迎留言討論。
關注公衆號【江南一點雨】,專一於 Spring Boot+微服務以及先後端分離等全棧技術,按期視頻教程分享,關注後回覆 Java ,領取鬆哥爲你精心準備的 Java 乾貨!