簡體   English   中英

Spring Boot外部屬性未加載

[英]Spring Boot external properties not loaded

我從Spring Boot開始,所以我首先要閱讀Spring Boot參考指南

我目前正在查看外部化配置

我的目標是要有一個簡單的Component來從application.properties讀取值,如果我沒有記錯的話,應該自動加載它,而無需進行任何進一步配置。

參考中的示例如下:

import org.springframework.stereotype.*
import org.springframework.beans.factory.annotation.*

@Component
public class MyBean {

    @Value("${name}")
    private String name;

    // ...

}

有以下說明:

在您的應用程序類路徑上(例如,在jar內),您可以具有application.properties,它為名稱提供了合理的默認屬性值。 在新環境中運行時,可以在jar外部提供application.properties,以覆蓋名稱; 對於一次性測試,您可以使用特定的命令行開關啟動(例如java -jar app.jar --name =“ Spring”)。

似乎很簡單。 因此,我創建了以下組件:

@Component
public class Admin {

    @Value("${name}")
    private String name;

    public String getName(){
        return "ReadName_" + name;
    }
}

並且,在我的recources文件夾中,以下application.properties文件(我已驗證將其復制到我的.jar中)

名字=我的名字

因此,如果我遵循參考中的邏輯(本文中也提到了該邏輯,請閱讀application.properties並運行我的應用程序。

該代碼可以編譯並運行,沒有錯誤,但是每次我從屏幕上的Admin實例打印getName()的值時,它只會給出一個“ ReadName_null”而不是屬性文件中的值“ ReadName_myName”。

作為參考,在24.2中:

默認情況下,SpringApplication會將所有命令行選項參數(以'-'開頭,例如--server.port = 9000)轉換為屬性,並將其添加到Spring Environment中。 如上所述,命令行屬性始終優先於其他屬性源。

因此,僅檢查一下,我同時運行了帶有既有密鑰的application.properties和我的.jar文件,並將--name=passedName添加為命令行參數。

即使此值應自動添加到環境中,並且否決當前存在的任何內容(或者在我的情況下為:無),並且我希望getName()返回“ ReadName_passedName”,但它仍將返回“ ReadName_null”。

編輯:我打印引導時傳遞的命令行參數,所以我知道該參數確實被系統讀取為“ --name = passedName”

有什么明顯的我想念的地方嗎?

如果執行new Admin () ,則將創建Admin的新實例,而不是spring bean。 因此您沒有得到spring提供的任何優勢(例如Dependency Injection),因此該值為null。

相反,您應該在課堂上對其進行自動布線。 這樣,spring將注入它創建的Admin實例(具有注入的值)

@Autowired
Admin admin;  

在您詢問之前,默認情況下,是的,所有bean都是單例(除非另有說明)。 因此,無論您在何處使用Autowire Admin,您都將獲得相同的實例。

這是一個廣泛的主題,您應該閱讀它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM