1. 概要

このクイックチュートリアルでは、Springプロパティファイルから配列またはListに値を挿入する方法を学習します。

2. デフォルトの動作

簡単なapplication.propertiesファイルから始めます。

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);
}

List には、プロパティファイルで設定した値と等しい単一の要素が含まれています。

リストを適切に挿入するには、 Spring Expression Language (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

リストを挿入するときに見たように、目的の区切り文字を指定できる特別な式を使用できます。

@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. 結論

このクイックチュートリアルでは、すばやく実用的な例を通じて、配列とリストを簡単に挿入する方法を学びました。

いつものように、コードはGitHubから入手できます。