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。