跳到主要內容

初探 Spring Boot Configuration

 前言

在 Spring Boot 中,Configuration 等同於應用程式的設定中心,可以用來管理:系統參數、資料庫連線、Port 設定、環境變數、不同環境(dev / test / prod)等等。Spring Boot 讓您可以將設定外部化,從而可以在不同的環境中使用相同的應用程式程式碼。您可以使用各種外部設定來源,包括 Java 屬性檔案、YAML 檔案、環境變數和命令列參數。您可以在這些檔案中定義應用程式或微服務在啟動時所需的所有配置和屬性。


問題

預設情況下,Spring Boot 應用程式會尋找您在 application.properties 檔案(application.yml)中定義的設定或屬性,並將該檔案放在了類別路徑中。

但是,如果您嘗試在屬性檔案中指定屬性或配置,則會將所有內容與原始程式碼綁在一起。因此,這種方法可能不太有效。這就是為什麼 Spring Boot 也支援其他方法來覆寫在 Application.properties 檔案中定義的預設值。



以下列出在 Spring Boot 應用程式中提供配置的最常用方法


Spring Boot 支援多種配置方式,優先順序(由高到低):

  1. Command Line Arguments (命令行參數)
  2. Java System Properties
  3. OS Environment Variables (環境變數)
  4. External Config Files (如專案外的 application.yml)
  5. Internal Config Files (專案內的 application.properties/yml)


注意! Spring Boot 有設定覆蓋機制



例如:

application.yml 設定檔











讀取 application.yml









%java target/accounts-0.0.1-SNAPSHOT.jar --server.port=9999


會覆蓋 application.yml port 設定

















命令列參數 --server.port=9999, 覆蓋 application.yml 的 port 8070 設定














如何讀取配置值


在代碼中讀取屬性的方法,有三種常用的方法。


第一種方法 是使用 @Value 註解。簡單、直觀、適合少量設定、支援預設值


例如:

@Value("${property.name:defaultValue}")

private String propertyValue; 



第二種方法 使用環境變數介面。動態讀取設定、可手動控制、支援預設值、可取得 Profile。


例如:

@Autowired

private Environment environment;


public String getProperty() {

String propertyValue = environment.getProperty("property.name");

return propertyValue;

}



第三種方法 @ConfigurationProperties。結構化管理、適合大型專案、型別安全


例如:

application.yml

app:

  payment:

    api-key: "sk_test_51Mz..."

    port: 8080

    base-url: "https://api.example.com"



Java

@Data

@Validated

@ConfigurationProperties(prefix = "app.payment")

public class PaymentProperties {


    @NotBlank

    private String apiKey;


    @Min(1000)

    @Max(9999)

    private int port;


    private String baseUrl;


}




以下簡單條列差異,方便實務參考












註:

動態讀取: 這三者在 Spring Boot 預設下都是啟動時決定。但在純 Spring Boot 下,Environment 能最直接拿到當下 Context 的值。










留言

這個網誌中的熱門文章

初探 Vue 呼叫 API 出現 CORS 跨來源資源共享 問題原因

提要:   在 {初探Vue 與 Spring boot 的對話} 專案 ,前端 Vue 應用程式 串接 後端 API 伺服器 ,axios 呼叫 API 時出現以下,”無法取得回應內容 (No 'Access-Control-Allow-Origin' header is present on the requested resource):” 錯誤訊息,根據查找相關資料 ,出現以下原因。 瀏覽器開發工具 錯誤訊息 畫面 錯誤原因: “ Access to XMLHttpRequest at ” from origin ‘http://localhost:8080’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource” 瀏覽器為了安全考量,實施了同源政策。 當您的前端應用程式 (http://localhost:8080) 嘗試呼叫一個不同來源 (不同協議、不同域名或不同埠號) 的 API 伺服器 (http://localhost:8088) 時,瀏覽器會主動阻止這個請求,除非伺服器明確地允許這個跨來源的存取。 同源政策限制(Same-Origin Policy): 同源政策限制了程式碼和不同網域資源間的互動,同源是指兩份網頁具備相同協定、埠號(如果有指定)以及主機位置 範例: 表列哪些 URL 與 URL http://www.example.com/api/p1 屬於同源: URL                                                   | 結果   | 原因 --------------------------------------------------------------------- http://www.example.com/api/p2     |...

初探 Vue 與 Spring boot 的對話之Frontend (Vue-Frontend)

  Front-end Vue 使用 REST API 建立 Vite 專案 可參考 { Vue 3 初探}  文章 danny@Danny-Yu projects % npm create vite@latest Need to install the following packages: create-vite@8.2.0 Ok to proceed? (y) y > npx > "create-vite" │ ◇   Project name: │   vue-frontend │ ◇   Select a framework: │   Vue │ ◇   Select a variant: │   TypeScript │ ◇   Use rolldown-vite (Experimental)?: │   No │ ◇   Install with npm and start now? │   Yes │ ◇   Scaffolding project in /Users/danny/Desktop/projects/vue-frontend... │ ◇   Installing dependencies with npm... added 47 packages, and audited 48 packages in 27s 6 packages are looking for funding   run `npm fund` for details found 0 vulnerabilities │ ◇   Starting dev server... > vue-frontend@0.0.0 dev > vite   VITE v7.2.4   ready in 411 ms   ➜   Local:   http://localhost:5173/   ➜   Network: use --host to expose   ➜   press h + enter to show...

初探 Spring 中的循環依賴

原因: 當兩個或多個 bean 直接或間接地相互依賴時, 就會出現 Circular Dependency (循環依賴) 如: Bean A -> Bean B -> Bean A import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class BeanA {          @Autowired     private BeanB beanB;     public String sayHi() {         return "Hi! 我是 Class A.";     } } import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class BeanB {          @Autowired     private BeanA beanA;     public String sayHi() {         return "Hi! 我是 Class B.";     } } 編譯時不會出現問題 danny@Danny-Yu demo % mvn clean install -Dmaven.test.skip=true                           ... ... [INFO] Installing /Users/danny/Desktop/projects/demo/target/dem...