知識庫 / Spring RSS 訂閱

從 Spring 屬性文件中注入數組和列表

Spring
HongKong
5
12:53 PM · Dec 06 ,2025

1. 概述

在本快速教程中,我們將學習如何從 Spring 屬性文件中將值注入到數組或 List 中。

2. 默認行為

我們將從一個簡單的 <em >application.properties</em> 文件開始:

arrayOfStrings=Baeldung,dot,com

讓我們看看當我們將變量類型設置為 String[] 時,Spring 的行為是怎樣的:

@Value("${arrayOfStrings}")
private String[] arrayOfStrings;
@Test
void whenContextIsInitialized_thenInjectedArrayContainsExpectedValues() {
    assertArrayEquals(new String[] {"Baeldung", "dot", "com"}, arrayOfStrings);
}

我們可以看到,Spring 正確地假設我們的分隔符是逗號並相應地初始化數組。

我們還應該注意到,默認情況下,當注入數組時,只有在具有逗號分隔值的情況下,才有效。

3. 注入列表

如果我們嘗試以相同的方式注入一個 List,將會得到一個令人驚訝的結果:

@Value("${arrayOfStrings}")
private List<String> unexpectedListOfStrings;
@Test
void whenContextIsInitialized_thenInjectedListContainsUnexpectedValues() {
    assertEquals(Collections.singletonList("Baeldung,dot,com"), unexpectedListOfStrings);
}

我們的 列表包含一個單一元素,其值與我們在屬性文件中設置的值相等。

為了正確地注入一個 列表,我們需要使用一種特殊的語法,稱為 Spring 表達式語言 (SpEL):

@Value("#{'${arrayOfStrings}'.split(',')}")
private List<String> listOfStrings;
@Test
void whenContextIsInitialized_thenInjectedListContainsExpectedValues() {
    assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStrings);
}

我們可以看到,我們的表達式從 # 開始,而不是我們習慣的與 $ 相關的 @Value

我們還應該注意到,我們正在調用 split 方法,這使得表達式比普通的注入更加複雜。

如果我們希望保持表達式的簡潔,我們可以使用特殊格式聲明我們的屬性:

listOfStrings={'Baeldung','dot','com'}

Spring 將識別這種格式,並且我們可以使用稍微簡單的表達式注入我們的 List

@Value("#{${listOfStrings}}")
private List<String> listOfStringsV2;
@Test
void whenContextIsInitialized_thenInjectedListV2ContainsExpectedValues() {
    assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStringsV2);
}

4. 使用自定義分隔符

讓我們創建一個類似的屬性,但這次我們將使用不同的分隔符:

listOfStringsWithCustomDelimiter=Baeldung;dot;com

正如我們已經看到的那樣,在注入 List 時,我們可以使用一個特殊表達式,其中可以指定我們想要的分隔符:

@Value("#{'${listOfStringsWithCustomDelimiter}'.split(';')}")
private List<String> listOfStringsWithCustomDelimiter;
@Test
void whenContextIsInitialized_thenInjectedListWithCustomDelimiterContainsExpectedValues() {
    assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStringsWithCustomDelimiter);
}

5. 注入其他類型

讓我們來查看以下屬性:

listOfBooleans=false,false,true
listOfIntegers=1,2,3,4
listOfCharacters=a,b,c

我們可以看到,Spring 默認支持基本數據類型,因此我們無需進行任何特殊解析:

@Value("#{'${listOfBooleans}'.split(',')}")
private List<Boolean> listOfBooleans;

@Value("#{'${listOfIntegers}'.split(',')}")
private List<Integer> listOfIntegers;

@Value("#{'${listOfCharacters}'.split(',')}")
private List<Character> listOfCharacters;
@Test
void whenContextIsInitialized_thenInjectedListOfBasicTypesContainsExpectedValues() {
    assertEquals(Arrays.asList(false, false, true), listOfBooleans);
    assertEquals(Arrays.asList(1, 2, 3, 4), listOfIntegers);
    assertEquals(Arrays.asList('a', 'b', 'c'), listOfCharacters);
}

僅通過 SpEL 支持,因此無法以相同的方式注入數組。

6. 通過編程讀取屬性

為了通過編程讀取屬性,首先需要獲取我們的 Environment 對象實例:

@Autowired
private Environment environment;

然後,我們只需使用 getProperty 方法來通過指定鍵和預期類型讀取任何屬性

@Test
void whenReadingFromSpringEnvironment_thenPropertiesHaveExpectedValues() {
    String[] arrayOfStrings = environment.getProperty("arrayOfStrings", String[].class);
    List<String> listOfStrings = (List<String>)environment.getProperty("arrayOfStrings", List.class);

    assertArrayEquals(new String[] {"Baeldung", "dot", "com"}, arrayOfStrings);
    assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStrings);
}

7. 結論

在本文中,我們學習瞭如何通過快速且實用的示例輕鬆地注入數組和 List

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

發佈 評論

Some HTML is okay.