iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
自我挑戰組

Spring Boot 三十天挑戰賽系列 第 9

Day 09 - Spring Boot Application Properties - 配置與屬性

  • 分享至 

  • xImage
  •  

Hurrayyyyy its' finally Sunday!!!
決定派出我的愛團 Imagine Dragons 來首 hype song 結束這週

Yes
FYI 再 97 天就要 2024 了 let's go!!/images/emoticon/emoticon05.gif

Spring Boot 憑藉著「約定大於配置」原則,簡化了 Java 開發過程。其中,如何配置也是個重要的議題。這篇文章會介紹 Spring Boot 的核心配置文件:application.properties or application.yml,以及如何利用 Profile-based 配置來應對不同環境。

1. 理解 application.propertiesapplication.yml

這兩個文件是Spring Boot中最常見的配置文件。它們都存在於 src/main/resources 目錄下。

  • application.properties:是一個以 key-value 方式呈現的文件。

    server.port=8080
    spring.datasource.url=jdbc:mysql://localhost:3306/meowmeowdb
    
  • application.yml:是一個 YAML 格式的文件,相比 .properties 文件更具有層次性和可讀性。

    server:
      port: 8080
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/meowmeowdb
    

以前初學時習慣使用 .properties ,後來逐漸換成 .yml 結構上比較明瞭。該選擇哪一種取決於專案團隊的偏好。喜歡結構清晰、層次分明,那 .yml 是不錯的選擇。

2. Profile-based 配置

在實際開發中,往往會遇到這樣的情境:DEV 環境、SIT 環境、UAT 環境、PROD 環境的配置都有所不同。Spring Boot 透過 Profile-based 配置來解決這個問題。

假如我們有一個開發環境和一個生產環境,我們可以這樣命名配置文件:

  • application-dev.propertiesapplication-dev.yml
  • application-prod.propertiesapplication-prod.yml

在運行 Spring Boot 應用時,你可以通過以下方式指定使用哪個配置:

$ java -jar ithomexdemoApplication.jar --spring.profiles.active=dev

或者,在 application.propertiesapplication.yml 中指定:

spring.profiles.active=dev

此外,還可以在 Java 中使用 @Profile 註解來指定某一段程式碼只在某個 Profile 下才運行:

@Configuration
@Profile("dev")
public class DevConfig {
    // ...
}

假設我們正在開發一個電商網站,可能需要在不同環境下進行不同的配置:

  1. 開發環境
    • 使用 MySQL 資料庫。
    • 開啟 DevTools。
    • 設置 Log 級別為 DEBUG
  2. 生產環境
    • 使用 MySQL 資料庫。
    • 優化 connection pool。
    • 設置 Log 級別為 ERROR

通過 Profile-based 的配置,我們可以輕鬆地進行管理,而不必手動更改配置或重新 compile 程式碼。

4. 使用 @Value@ConfigurationProperties

當配置完成後,如果需要在程式碼中使用這些配置 value 值。Spring Boot 也提供了兩種方式

  1. 使用 @Value

    @Component
    public class MyService {
    
        @Value("${server.port}")
        private int port;
    
        public void printPort() {
            System.out.println("Server Port: " + port);
        }
    }
    
    
  2. **使用 @ConfigurationProperties:**將配置文件中的一組屬性映射到一個 Bean 上

    @Component
    @ConfigurationProperties(prefix = "spring.datasource")
    public class DataSourceProperties {
    
        private String url;
        private String username;
        private String password;
        // getters and setters...
    }
    

6. 擺放和讀取順序

啟動一個 Spring Boot project 時,它有一個固定的順序來讀取配置文件。

  1. From the classpath
    1. The classpath root → classpath 根目錄
    2. The classpath /config package → classpath:/config 資料夾中
  2. From the current directory
    1. The current directory → 當前目錄
    2. The config/ subdirectory in the current directory → 當前目錄下的 /config 子目錄
    3. Immediate child directories of the config/ subdirectory

這順序意味著外部目錄的配置文件會覆蓋內部相同的配置。


  1. Profile-specific 文件的搜尋順序:

    假設我們已經啟動了一個名為 prod 的profile,那麼Spring Boot會尋找名為 application-prod.propertiesapplication-prod.yml 的文件。這些 profile-specific 的文件會覆蓋 default 配置文件中相同的屬性。

  2. 配置文件的讀取順序:

    Spring Boot 首先讀取 default 配置文件 application.propertiesapplication.yml。接著繼續讀取與啟動 profiles 相對應的文件。例如,如果啟動了 devprod profiles,Spring Boot 會按以下順序讀取文件:

    • application.yml
    • application-dev.yml
    • application-prod.yml

    在這個過程中,讀取的文件中將覆蓋讀取文件中相同的配置。

今天這篇帶大家了解 Spring Boot 配置文件,如此能讓我們更靈活地去管理和組織專案中的配置,進而在不同的環境中都能夠確保應用程式使用正確的配置運行!


上一篇
Day 08 - Directory Structure - Spring Boot 目錄結構
下一篇
Day 10 - RESTful: @RestController & @RequestMapping
系列文
Spring Boot 三十天挑戰賽30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言