知識庫 / Spring / Spring Boot RSS 訂閱

在靜態字段中注入值 (Spring)

Spring Boot
HongKong
4
01:02 PM · Dec 06 ,2025

1. 概述

在本教程中,我們將學習如何使用 Spring 將值注入到靜態字段中。

2. 問題

首先,讓我們假設我們設置了一個屬性到 properties 文件:

name = Inject a value to a static field

之後,我們希望將其值注入到一個實例變量中。

通常可以通過在實例字段上使用 @Value 註解來實現。

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

因此,我們可能想使用 @Value 將值注入到靜態字段中:

@Component
public class StaticPropertyHolder {

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

    public static String getStaticNameInjectedOnField() {
        return STATIC_NAME_INJECTED_ON_FIELD;
    }
}

然而,當我們嘗試將其應用於靜態字段時,我們會發現它仍然是 null

assertNull(StaticPropertyHolder.getStaticNameInjectedOnField());

之所以這樣,是因為 Spring 不支持在靜態字段上使用 @Value

接下來,我們來探討如何使用 @Value 註解將值注入到靜態字段中。

3. 解決方案

首先,讓我們聲明一個新的私有靜態變量,併為其定義相應的 getter 和 setter 方法:

private static String STATIC_NAME;

@Value("${name}")
public void setStaticName(String name) {
    STATIC_NAME = name;
}

public static String getStaticName() {
    return STATIC_NAME;
}

如我們所見,我們使用 @Value 註解來標註 setter 方法。

在此,預期值被注入:

assertEquals("Inject a value to a static field", StaticPropertyHolder.getStaticName());

Spring 使用依賴注入機制在找到帶有 @Value 註解時,填充特定的值。 但是,它不是將值傳遞給實例變量,而是將其傳遞給隱式 setter。 這種 setter 負責填充我們的 STATIC_NAME  值。

4. 結論

在本文中,我們探討了如何將值從屬性文件注入到靜態變量中。關鍵要點是使用 <em@Value> 在設置方法上,而不是直接在靜態字段本身上。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.