今天我們要學會如何在 Spring Boot 的世界裡靈活地「設定」它。您是否曾經因為只是想修改一個資料庫密碼,就需要重新編譯、打包整個專案?這正是傳統開發中的痛點。今天內容將帶您認識 Spring Boot 中一個極為重要的核心概念 — Properties (屬性),您將發現,學會它,就像拿到了整個應用程式的「遙-控-器」,讓您能優雅地應對各種變化!
在 Spring Boot 中,Properties (屬性) 就像是應用程式的控制面板 (Control Panel) 或遙控器,它允許我們在不修改任何 Java 程式碼的情況下,去調整和控制應用程式的行為。這個概念也被稱為「外部化配置 (Externalized Configuration)」,是現代化應用程式開發的基石。
這些設定通常被集中存放在一個或多個設定檔中,最常見的就是:
application.properties
application.yml
透過它,我們可以輕鬆完成許多事,例如:
true
/false
) 來決定某個功能是否要啟用。比喻:想像一下您家裡的智慧家庭系統。您不需要每次都爬梯子、拆開燈具來調整亮度,只需要拿起手機 App (遙控器) 按幾下即可。
Properties 就是 Spring Boot 應用程式的那個遙控器,而 application.properties
檔案就是那個 App 的設定頁面。
為什麼我們不直接把資料庫密碼、伺服器埠號寫在 Java 程式碼裡呢?這就是 Properties 所要解決的核心問題 — 將設定與程式碼分離。這樣做有幾個巨大的好處:
集中管理設定:
想像一下,如果應用程式的設定散落在數十個不同的程式碼檔案中,當需要修改時,就像一場災難。Properties 讓我們可以將所有設定都放在同一個地方,它就像是專案的「設定總管」,一目了然,修改起來既安全又方便。
環境獨立性:
一個應用程式從誕生到上線,通常會在多個環境中運行,例如:
dev
(開發環境):工程師在本機開發使用,可能會連接本機的資料庫,或是使用輕量的記憶體資料庫 (In-memory Database) 來加速啟動。
uat
(測試環境):給測試人員驗證功能使用,會連接到一台專門的測試資料庫,裡面的資料可以隨意修改而不用擔心影響正式服務。
prod
(正式環境):給所有使用者正式上線使用,連接的是穩定、高效能且受嚴格保護的正式資料庫。
如果沒有 Properties,我們可能需要在每次部署到不同環境前,手動去修改程式碼中的設定,這不僅耗時,而且極易出錯(例如:不小心在測試時連到正式資料庫,造成資料污染)。Properties 讓我們可以為每個環境準備一套專屬的設定,輕鬆切換,安全可靠。
易於覆寫與部署:
在現代的自動化部署流程 (CI/CD) 中,我們經常需要動態地傳入設定。例如,資料庫密碼這類敏感資訊,不應該直接寫在設定檔裡,而是由部署系統在啟動應用程式時透過環境變數或命令列參數傳入。Properties 機制完美支援這種方式,讓應用程式的部署更具彈性與安全性。
比喻:您可以把不同的環境設定想像成衣櫥裡的多套衣服。今天只是在辦公室工作 (dev),就穿休閒裝;明天要去客戶那裡開會 (uat),就換上商務便服;週末要去參加晚宴 (prod),就換上正式的西裝。您不需要改變您的身體 (程式碼),只需要根據不同場合 (環境),換一套對的衣服 (設定檔) 即可。
.properties
vs .yml
Spring Boot 支援兩種主要的設定檔格式,它們功能完全相同,只是寫法風格不同。讓我們用一個更完整的資料庫設定範例來看看它們的差異。
application.properties
採用傳統的「鍵=值」(key-value pair) 格式,每一行都是一個獨立的設定。當層級變多時,需要重複撰寫相同的前綴(prefixes)。須注意,=
前後兩邊不可有空格。
# --- 資料庫設定 ---
# 連線 URL
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
# 使用者名稱
spring.datasource.username=root
# 密碼
spring.datasource.password=123456
application.yml
# 結構化的設定
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: 123456
特性 | .properties | .yml |
---|---|---|
語法 | key=value (注意等號兩邊不可有空格) |
key: value (注意冒號後有空格) |
可讀性 | 簡單設定時清晰 | 複雜設定時,層級結構更清晰 |
複雜資料 | 支援列表,但語法較繁瑣 | 原生支援列表、Map 等複雜結構 |
註解 | # |
# |
該如何選擇?
對於初學者,兩者都可以。.yml
格式因為其層次分明的結構,在管理複雜設定時更受歡迎,也是目前社群的主流趨勢。最重要的原則是:在您的團隊中保持風格統一即可!
佔位符 (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) 甚至可以讀取您電腦的系統環境變數。
app.maven.path=${MAVEN_HOME:null}
這顯示了 Spring Boot 設定的強大靈活性。
前面提過,應用程式需要在不同環境 (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 會:
application.properties
作為基礎層。application-dev.properties
作為覆蓋層。-dev
) 的值會生效。如果某個設定只存在於基礎層,它依然會被保留。例如:
application.properties
server.port=80
app.welcome-message=Welcome!
application-dev.properties
server.port=8080
當啟用 dev
Profile 時,最終生效的設定會是 server.port=8080
和 app.welcome-message=Welcome!
。