詳解Spring Boot配置文件application.properties
在 Spring Boot 中,配置文件有兩種不同的格式,一個是 properties ,另一個是 yaml 。
雖然 properties 文件比較常見,但是相對于 properties 而言,yaml 更加簡潔明了,而且使用的場景也更多,很多開源項目都是使用 yaml 進行配置(例如 Hexo)。除了簡潔,yaml 還有另外一個特點,就是 yaml 中的數(shù)據(jù)是有序的,properties 中的數(shù)據(jù)是無序的,在一些需要路徑匹配的配置中,順序就顯得尤為重要(例如我們在 Spring Cloud Zuul 中的配置),此時我們一般采用 yaml。
本文主要來看看 properties 的問題。
位置問題
首先,當我們創(chuàng)建一個 Spring Boot 工程時,默認 resources 目錄下就有一個 application.properties 文件,可以在 application.properties 文件中進行項目配置,但是這個文件并非唯一的配置文件,在 Spring Boot 中,一共有 4 個地方可以存放 application.properties 文件。
- 當前項目根目錄下的 config 目錄下
- 當前項目的根目錄下
- resources 目錄下的 config 目錄下
- resources 目錄下
按如上順序,四個配置文件的優(yōu)先級依次降低。如下:
這四個位置是默認位置,即 Spring Boot 啟動,默認會從這四個位置按順序去查找相關(guān)屬性并加載。但是,這也不是絕對的,我們也可以在項目啟動時自定義配置文件位置。
例如,現(xiàn)在在 resources 目錄下創(chuàng)建一個 javaboy 目錄,目錄中存放一個 application.properties 文件,那么正常情況下,當我們啟動 Spring Boot 項目時,這個配置文件是不會被自動加載的。我們可以通過 spring.config.location 屬性來手動的指定配置文件位置,指定完成后,系統(tǒng)就會自動去指定目錄下查找 application.properties 文件。
此時啟動項目,就會發(fā)現(xiàn),項目以 classpath:/javaboy/application.propertie 配置文件啟動。
這是在開發(fā)工具中配置了啟動位置,如果項目已經(jīng)打包成 jar ,在啟動命令中加入位置參數(shù)即可:
java -jar properties-0.0.1-SNAPSHOT.jar --spring.config.location=classpath:/javaboy/
文件名問題
對于 application.properties 而言,它不一定非要叫 application ,但是項目默認是去加載名為 application 的配置文件,如果我們的配置文件不叫 application ,也是可以的,但是,需要明確指定配置文件的文件名。
方式和指定路徑一致,只不過此時的 key 是 spring.config.name 。
首先我們在 resources 目錄下創(chuàng)建一個 app.properties 文件,然后在 IDEA 中指定配置文件的文件名:
指定完配置文件名之后,再次啟動項目,此時系統(tǒng)會自動去默認的四個位置下面分別查找名為 app.properties 的配置文件。當然,允許自定義文件名的配置文件不放在四個默認位置,而是放在自定義目錄下,此時就需要明確指定 spring.config.location 。
配置文件位置和文件名稱可以同時自定義。
普通的屬性注入
由于 Spring Boot 源自 Spring ,所以 Spring 中存在的屬性注入,在 Spring Boot 中一樣也存在。由于 Spring Boot 中,默認會自動加載 application.properties 文件,所以簡單的屬性注入可以直接在這個配置文件中寫。
例如,現(xiàn)在定義一個 Book 類:
public class Book { private Long id; private String name; private String author; //省略 getter/setter }
然后,在 application.properties 文件中定義屬性:
book.name=三國演義 book.author=羅貫中 book.id=1
按照傳統(tǒng)的方式(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 對象,啟動項目,就可以看到屬性已經(jīng)注入到對象中了。
一般來說,我們在 application.properties 文件中主要存放系統(tǒng)配置,這種自定義配置不建議放在該文件中,可以自定義 properties 文件來存在自定義配置。
例如在 resources 目錄下,自定義 book.properties 文件,內(nèi)容如下:
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 沒有任何關(guān)系。
類型安全的屬性注入
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 容器中對應(yīng)的數(shù)據(jù)注入到對象對應(yīng)的屬性中,就不用通過 @Value 注解挨個注入了,減少工作量并且避免出錯。
總結(jié)
application.properties 是 Spring Boot 中配置的一個重要載體,很多組件的屬性都可以在這里定制。
相關(guān)文章
Java求字符串中出現(xiàn)次數(shù)最多的字符串以及出現(xiàn)次數(shù)
這篇文章主要為大家詳細介紹了Java統(tǒng)計字符串中出現(xiàn)次數(shù)最多的字符串以及出現(xiàn)次數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04Springboot 使用 maven-resources-plugin 打包變量替換ja
這篇文章主要介紹了Springboot 使用 maven-resources-plugin 打包變量替換jar沒有打包進去、Jar包沒有被使用的解決方法,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧2024-08-08Spring中@PropertySource和@Value注解詳解
這篇文章主要介紹了Spring中@PropertySource和@Value注解詳解,@PropertySource注解可以方便和靈活的向Spring的環(huán)境容器(org.springframework.core.env.Environment Environment)中注入一些屬性,這些屬性可以在Bean中使用,需要的朋友可以參考下2023-11-11Java中用Socket實現(xiàn)HTTP文件上傳實例
本篇文章主要介紹了Java中用Socket實現(xiàn)HTTP文件上傳實例,詳細的介紹了通過讀取Socket的輸入流來實現(xiàn)一個文件上傳的功能,有興趣的同學可以一起了解一下2017-04-04Java Swing組件實現(xiàn)進度監(jiān)視功能示例
這篇文章主要介紹了Java Swing組件實現(xiàn)進度監(jiān)視功能,結(jié)合完整實例形式詳細分析了Java基于Swing組件實現(xiàn)進度條顯示功能的具體操作技巧與相關(guān)注意事項,需要的朋友可以參考下2018-02-02Spring Cloud下基于OAUTH2認證授權(quán)的實現(xiàn)示例
這篇文章主要介紹了Spring Cloud下基于OAUTH2認證授權(quán)的實現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03Springboot 實現(xiàn)數(shù)據(jù)庫備份還原的方法
這篇文章主要介紹了Springboot 實現(xiàn)數(shù)據(jù)庫備份還原的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09