1. 程式人生 > >Spring Boot2 系列教程(四)理解Spring Boot 配置檔案 application.properties

Spring Boot2 系列教程(四)理解Spring Boot 配置檔案 application.properties

在 Spring Boot 中,配置檔案有兩種不同的格式,一個是 properties ,另一個是 yaml 。

雖然 properties 檔案比較常見,但是相對於 properties 而言,yaml 更加簡潔明瞭,而且使用的場景也更多,很多開源專案都是使用 yaml 進行配置(例如 Hexo)。除了簡潔,yaml 還有另外一個特點,就是 yaml 中的資料是有序的,properties 中的資料是無序的,在一些需要路徑匹配的配置中,順序就顯得尤為重要(例如我們在 Spring Cloud Zuul 中的配置),此時我們一般採用 yaml。關於 yaml ,鬆哥之前寫過一篇文章:Spring Boot 中的 yaml 配置簡介。

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

位置問題

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

  1. 當前專案根目錄下的 config 目錄下
  2. 當前專案的根目錄下
  3. resources 目錄下的 config 目錄下
  4. resources 目錄下

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

這四個位置是預設位置,即 Spring Boot 啟動,預設會從這四個位置按順序去查詢相關屬性並載入。但是,這也不是絕對的,我們也可以在專案啟動時自定義配置檔案位置。

例如,現在在 resources 目錄下建立一個 javaboy 目錄,目錄中存放一個 application.properties 檔案,那麼正常情況下,當我們啟動 Spring Boot 專案時,這個配置檔案是不會被自動載入的。我們可以通過 spring.config.location 屬性來手動的指定配置檔案位置,指定完成後,系統就會自動去指定目錄下查詢 application.properties 檔案。

此時啟動專案,就會發現,專案以 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 乾貨!

相關推薦

Spring Boot2 系列教程()理解Spring Boot 配置檔案 application.properties

在 Spring Boot 中,配置檔案有兩種不同的格式,一個是 properties ,另一個是 yaml 。 雖然 properties 檔案比較常見,但是相對於 properties 而言,yaml 更加簡潔明瞭,而且使用的場景也更多,很多開源專案都是使用 yaml 進行配置(例如 Hexo)。除了簡潔

Spring Boot2 系列教程(三)理解 Spring Boot 專案中的 parent

前面和大夥聊了 Spring Boot 專案的三種建立方式,這三種建立方式,無論是哪一種,建立成功後,pom.xml 座標檔案中都有如下一段引用: <parent> <groupId>org.springframework.boot</groupId> &l

Spring Boot2 系列教程(二)建立 Spring Boot 專案的三種方式

我最早是 2016 年底開始寫 Spring Boot 相關的部落格,當時使用的版本還是 1.4.x ,文章發表在 CSDN 上,閱讀量最大的一篇有 43W+,如下圖: 2017 年由於種種原因,就沒有再繼續更新 Spring Boot 相關的部落格了,2018年又去寫書了,也沒更新,現在 Spring

Spring Boot2 系列教程(七)理解自動化配置的原理

Spring Boot 中的自動化配置確實夠吸引人,甚至有人說 Spring Boot 讓 Java 又一次煥發了生機,這話雖然聽著有點誇張,但是不可否認的是,曾經臃腫繁瑣的 Spring 配置確實讓人感到頭大,而 Spring Boot 帶來的全新自動化配置,又確實緩解了這個問題。 你要是問這個自動化配置是

Spring Boot2 系列教程(十一)Spring Boot 中的靜態資源配置

當我們使用 SpringMVC 框架時,靜態資源會被攔截,需要新增額外配置,之前老有小夥伴在微信上問鬆哥 Spring Boot 中的靜態資源載入問題:“鬆哥,我的 HTML 頁面好像沒有樣式?”,今天我就通過一篇文章,來和大夥仔細聊一聊這個問題。 1. SSM 中的配置 要講 Spring Boot 中的問

Spring Boot2 系列教程(十八)Spring Boot 中自定義 SpringMVC 配置

用過 Spring Boot 的小夥伴都知道,我們只需要在專案中引入 spring-boot-starter-web 依賴,SpringMVC 的一整套東西就會自動給我們配置好,但是,真實的專案環境比較複雜,系統自帶的配置不一定滿足我們的需求,往往我們還需要結合實際情況自定義配置。 自定義配置就有講究了,由於

Spring Boot2 系列教程(十九)Spring Boot 整合 JdbcTemplate

在 Java 領域,資料持久化有幾個常見的方案,有 Spring 自帶的 JdbcTemplate 、有 MyBatis,還有 JPA,在這些方案中,最簡單的就是 Spring 自帶的 JdbcTemplate 了,這個東西雖然沒有 MyBatis 那麼方便,但是比起最開始的 Jdbc 已經強了很多了,它沒有

Spring Boot2 系列教程(三十)Spring Boot 整合 Ehcache

用慣了 Redis ,很多人已經忘記了還有另一個快取方案 Ehcache ,是的,在 Redis 一統江湖的時代,Ehcache 漸漸有點沒落了,不過,我們還是有必要了解下 Ehcache ,在有的場景下,我們還是會用到 Ehcache。 今天鬆哥就來和大家聊聊 Spring Boot 中使用 Ehcach

Spring Boot2 系列教程(二十)Spring Boot 整合 Jpa

Spring Boot 中的資料持久化方案前面給大夥介紹了兩種了,一個是 JdbcTemplate,還有一個 MyBatis,JdbcTemplate 配置簡單,使用也簡單,但是功能也非常有限,MyBatis 則比較靈活,功能也很強大,據我所知,公司採用 MyBatis 做資料持久化的相當多,但是 MyBat

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

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

Spring Boot2 系列教程(六)自定義 Spring Boot 中的 starter

我們使用 Spring Boot,基本上都是沉醉在它 Stater 的方便之中。Starter 為我們帶來了眾多的自動化配置,有了這些自動化配置,我們可以不費吹灰之力就能搭建一個生產級開發環境,有的小夥伴會覺得這個 Starter 好神奇呀!其實 Starter 也都是 Spring + SpringMVC

Spring Boot2 系列教程(八)Spring Boot配置 Https

https 現在已經越來越普及了,特別是做一些小程式或者公眾號開發的時候,https 基本上都是剛需了。 不過一個 https 證書還是挺費錢的,個人開發者可以在各個雲服務提供商那裡申請一個免費的證書。我印象中有效期一年,可以申請 20 個。 今天要和大家聊的是在 Spring Boot 專案中,如何開啟 h

Spring Boot2 系列教程(九)Spring Boot 整合 Thymeleaf

雖然現在慢慢在流行前後端分離開發,但是據鬆哥所瞭解到的,還是有一些公司在做前後端不分的開發,而在前後端不分的開發中,我們就會需要後端頁面模板(實際上,即使前後端分離,也會在一些場景下需要使用頁面模板,例如郵件傳送模板)。 早期的 Spring Boot 中還支援使用 Velocity 作為頁面模板,現在的

Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker

今天來聊聊 Spring Boot 整合 Freemarker。 Freemarker 簡介 這是一個相當老牌的開源的免費的模版引擎。通過 Freemarker 模版,我們可以將資料渲染成 HTML 網頁、電子郵件、配置檔案以及原始碼等。Freemarker 不是面向終端使用者的,而是一個 Java 類庫,我

Spring Boot2 系列教程(十)CORS 解決跨域問題

今天和小夥伴們來聊一聊通過CORS解決跨域問題。 同源策略 很多人對跨域有一種誤解,以為這是前端的事,和後端沒關係,其實不是這樣的,說到跨域,就不得不說說瀏覽器的同源策略。 同源策略是由 Netscape 提出的一個著名的安全策略,它是瀏覽器最核心也最基本的安全功能,現在所有支援 JavaScript 的瀏覽

Spring Boot2 系列教程(二十三)理解 Spring Data Jpa

有很多讀者留言希望鬆哥能好好聊聊 Spring Data Jpa! 其實這個話題鬆哥以前零零散散的介紹過,在我的書裡也有介紹過,但是在公眾號中還沒和大夥聊過,因此本文就和大家來仔細聊聊 Spring Data 和 Jpa! 本文大綱: 1. 故事的主角 1.1 Jpa 1.1.1 JPA 是什麼 Jav

Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多資料來源

本文是 Spring Boot 整合資料持久化方案的最後一篇,主要和大夥來聊聊 Spring Boot 整合 Jpa 多資料來源問題。在 Spring Boot 整合JbdcTemplate 多資料來源、Spring Boot 整合 MyBatis 多資料來源以及 Spring Boot 整合 Jpa 多資料

Spring Boot2 系列教程(二十六)Spring Boot 整合 Redis

在 Redis 出現之前,我們的快取框架各種各樣,有了 Redis ,快取方案基本上都統一了,關於 Redis,鬆哥之前有一個系列教程,尚不瞭解 Redis 的小夥伴可以參考這個教程: Redis 教程合集 使用 Java 操作 Redis 的方案很多,Jedis 是目前較為流行的一種方案,除了 Jedi

Spring Boot2 系列教程(二十八)Spring Boot 整合 Session 共享

這篇文章是鬆哥的原創,但是在第一次釋出的時候,忘了標記原創,結果被好多號轉發,導致我後來整理的時候自己沒法標記原創了。寫了幾百篇原創技術乾貨了,有一兩篇忘記標記原創進而造成的一點點小小損失也能接受,不過還是要和小夥伴們說明一下。 在傳統的單服務架構中,一般來說,只有一個伺服器,那麼不存在 Session

Spring Boot2 系列教程(二十九)Spring Boot 整合 Redis

經過 Spring Boot 的整合封裝與自動化配置,在 Spring Boot 中整合Redis 已經變得非常容易了,開發者只需要引入 Spring Data Redis 依賴,然後簡單配下 redis 的基本資訊,系統就會提供一個 RedisTemplate 供開發者使用,但是今天鬆哥想和大夥聊的不是這種