iT邦幫忙

2025 iThome 鐵人賽

DAY 8
1
Software Development

spring boot 3 學習筆記系列 第 8

Day08 - Spring Boot Properties 概念入門

  • 分享至 

  • xImage
  •  

今天我們要學會如何在 Spring Boot 的世界裡靈活地「設定」它。您是否曾經因為只是想修改一個資料庫密碼,就需要重新編譯、打包整個專案?這正是傳統開發中的痛點。今天內容將帶您認識 Spring Boot 中一個極為重要的核心概念 — Properties (屬性),您將發現,學會它,就像拿到了整個應用程式的「遙-控-器」,讓您能優雅地應對各種變化!

Properties 是什麼?— 應用程式的遙控器

在 Spring Boot 中,Properties (屬性) 就像是應用程式的控制面板 (Control Panel)遙控器,它允許我們在不修改任何 Java 程式碼的情況下,去調整和控制應用程式的行為。這個概念也被稱為「外部化配置 (Externalized Configuration)」,是現代化應用程式開發的基石。

這些設定通常被集中存放在一個或多個設定檔中,最常見的就是:

  • application.properties
  • application.yml

透過它,我們可以輕鬆完成許多事,例如:

  • 設定資料庫連線:告訴應用程式要連到哪一台資料庫、使用者名稱與密碼是什麼。
  • 指定伺服器埠號:決定應用程式要在哪個「門牌號碼」提供服務 (例如 8080、9000)。
  • 控制日誌級別:設定要顯示多詳細的系統執行訊息,方便除錯。例如,開發時看詳細資訊 (DEBUG),上線後只看錯誤訊息 (ERROR)。
  • 設定外部服務連線:管理與其他服務 (如郵件伺服器、雲端儲存、第三方 API) 的連接金鑰 (API Keys)。
  • 啟用或關閉特定功能:透過一個簡單的開關 (true/false) 來決定某個功能是否要啟用。

比喻:想像一下您家裡的智慧家庭系統。您不需要每次都爬梯子、拆開燈具來調整亮度,只需要拿起手機 App (遙控器) 按幾下即可。

Properties 就是 Spring Boot 應用程式的那個遙控器,而 application.properties 檔案就是那個 App 的設定頁面。

為什麼要用 Properties?— 告別「寫死」(Hard-coding) 的程式碼

為什麼我們不直接把資料庫密碼、伺服器埠號寫在 Java 程式碼裡呢?這就是 Properties 所要解決的核心問題 — 將設定與程式碼分離。這樣做有幾個巨大的好處:

  • 集中管理設定
    想像一下,如果應用程式的設定散落在數十個不同的程式碼檔案中,當需要修改時,就像一場災難。Properties 讓我們可以將所有設定都放在同一個地方,它就像是專案的「設定總管」,一目了然,修改起來既安全又方便。

  • 環境獨立性
    一個應用程式從誕生到上線,通常會在多個環境中運行,例如:

    • dev (開發環境):工程師在本機開發使用,可能會連接本機的資料庫,或是使用輕量的記憶體資料庫 (In-memory Database) 來加速啟動。

    • uat (測試環境):給測試人員驗證功能使用,會連接到一台專門的測試資料庫,裡面的資料可以隨意修改而不用擔心影響正式服務。

    • prod (正式環境):給所有使用者正式上線使用,連接的是穩定、高效能且受嚴格保護的正式資料庫。

      如果沒有 Properties,我們可能需要在每次部署到不同環境前,手動去修改程式碼中的設定,這不僅耗時,而且極易出錯(例如:不小心在測試時連到正式資料庫,造成資料污染)。Properties 讓我們可以為每個環境準備一套專屬的設定,輕鬆切換,安全可靠。

  • 易於覆寫與部署
    在現代的自動化部署流程 (CI/CD) 中,我們經常需要動態地傳入設定。例如,資料庫密碼這類敏感資訊,不應該直接寫在設定檔裡,而是由部署系統在啟動應用程式時透過環境變數命令列參數傳入。Properties 機制完美支援這種方式,讓應用程式的部署更具彈性與安全性。

比喻:您可以把不同的環境設定想像成衣櫥裡的多套衣服。今天只是在辦公室工作 (dev),就穿休閒裝;明天要去客戶那裡開會 (uat),就換上商務便服;週末要去參加晚宴 (prod),就換上正式的西裝。您不需要改變您的身體 (程式碼),只需要根據不同場合 (環境),換一套對的衣服 (設定檔) 即可。

兩種主流格式:.properties vs .yml

Spring Boot 支援兩種主要的設定檔格式,它們功能完全相同,只是寫法風格不同。讓我們用一個更完整的資料庫設定範例來看看它們的差異。

  1. application.properties

採用傳統的「鍵=值」(key-value pair) 格式,每一行都是一個獨立的設定。當層級變多時,需要重複撰寫相同的前綴(prefixes)。須注意,= 前後兩邊不可有空格。

# --- 資料庫設定 ---
# 連線 URL
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
# 使用者名稱
spring.datasource.username=root
# 密碼
spring.datasource.password=123456
  1. application.yml
# 結構化的設定
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: 123456
特性 .properties .yml
語法 key=value (注意等號兩邊不可有空格) key: value (注意冒號後有空格)
可讀性 簡單設定時清晰 複雜設定時,層級結構更清晰
複雜資料 支援列表,但語法較繁瑣 原生支援列表、Map 等複雜結構
註解 # #

該如何選擇?
對於初學者,兩者都可以。.yml 格式因為其層次分明的結構,在管理複雜設定時更受歡迎,也是目前社群的主流趨勢。最重要的原則是:在您的團隊中保持風格統一即可!

什麼是佔位符 (Placeholders)?— 讓設定變得更聰明

佔位符 (Placeholders) 是一種可以「重用」其他屬性值的語法,讓您的設定檔更加簡潔和靈活,完美符合 DRY (Don't Repeat Yourself) 的程式設計原則。它使用 ${} 符號。

比喻:這就像是 Word 文件裡的「郵件合併」功能,您可以用一個變數 (例如 ${收件人姓名}) 來代替固定的文字。

基本用法 (重用屬性)

假設您有多個服務都基於同一個主機位址,您可以這樣設定:

app.host=api.example.com
user.service.url=https://${app.host}/users
order.service.url=https://${app.host}/orders

在這裡,如果未來主機位址變更,您只需要修改 app.host 一個地方即可,非常方便。

帶預設值

您還可以提供一個預設值,以防某個屬性沒有被設定。這在開發時特別有用,可以讓程式在沒有額外設定的情況下也能順利啟動。

# 如果環境變數 PORT 沒有提供,就預設使用 8080
server.port=${PORT:8080}

引用系統變數

佔位符 (Placeholders) 甚至可以讀取您電腦的系統環境變數。

https://ithelp.ithome.com.tw/upload/images/20250826/20171829IyESO2Bzy5.png

app.maven.path=${MAVEN_HOME:null}

這顯示了 Spring Boot 設定的強大靈活性。

多重設定檔 (Profiles) — 為不同環境穿上對應的「衣服」

前面提過,應用程式需要在不同環境 (dev, uat, prod) 中運行。Profiles 就是 Spring Boot 實現這個需求的機制。它不僅僅是切換檔案,更是一種聰明的「設定分層與覆蓋」機制。

我們可以透過建立不同命名的設定檔來為每個環境定義專屬的設定:

  • application.properties (基礎設定檔,所有環境共用)
  • application-dev.properties (開發環境專用設定)
  • application-ust.properties (測試環境專用設定)
  • application-prod.properties (正式環境專用設定)

接著,只需要在主要的設定檔 application.properties 中告訴 Spring Boot 現在要啟用哪一個 Profile 即可:

# 指定目前要啟用 'dev' 這個 Profile
spring.profiles.active=dev

它是如何運作的?

當應用程式以 dev Profile 啟動時,Spring Boot 會:

  1. 首先,載入 application.properties 作為基礎層。
  2. 然後,載入 application-dev.properties 作為覆蓋層。
  3. 如果兩個檔案有相同的設定鍵,則覆蓋層 (-dev) 的值會生效。如果某個設定只存在於基礎層,它依然會被保留。

例如:

  • application.properties

    server.port=80
    app.welcome-message=Welcome!
    
  • application-dev.properties

    server.port=8080
    

當啟用 dev Profile 時,最終生效的設定會是 server.port=8080app.welcome-message=Welcome!

相關資料來源


上一篇
Day07 - Spring Boot pom.xml 解析
下一篇
Day09 - Spring Boot Properties 實戰與進階
系列文
spring boot 3 學習筆記17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言