1. 概要

このクイックチュートリアルでは、@ValueSpringアノテーションを確認します。

このアノテーションは、Springが管理するBeanのフィールドに値を挿入するために使用でき、フィールドまたはコンストラクター/メソッドのパラメーターレベルで適用できます。

2. アプリケーションの設定

このアノテーションのさまざまな種類の使用法を説明するには、単純なSpringアプリケーション構成クラスを構成する必要があります。

当然、 @Value アノテーションを付けて挿入する値を定義するには、プロパティファイルが必要です。 したがって、最初に、構成クラスで @PropertySourceをプロパティファイル名で定義する必要があります。

プロパティファイルを定義しましょう:

value.from.file=Value got from the file
priority=high
listOfValues=A,B,C

3. 使用例

基本的でほとんど役に立たない例として、注釈からフィールドに「文字列値」を挿入することしかできません。

@Value("string value")
private String stringValue;

@PropertySource アノテーションを使用すると、@Valueアノテーションを使用してプロパティファイルの値を操作できます。

次の例では、フィールドに割り当てられたファイルから取得したValueを取得します。

@Value("${value.from.file}")
private String valueFromFile;

同じ構文でシステムプロパティから値を設定することもできます。

systemValueという名前のシステムプロパティを定義したと仮定します。

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

定義されていない可能性のあるプロパティには、デフォルト値を指定できます。 ここでは、値 somedefaultが挿入されます。

@Value("${unknown.param:some default}")
private String someDefault;

同じプロパティがシステムプロパティとしてプロパティファイルで定義されている場合、システムプロパティが適用されます。

プロパティpriorityが、値 System property のシステムプロパティとして定義され、プロパティファイルで他の何かとして定義されているとします。 値はシステムプロパティになります。

@Value("${priority}")
private String prioritySystemProperty;

場合によっては、一連の値を挿入する必要があります。 プロパティファイル内の単一プロパティのコンマ区切り値またはシステムプロパティとして定義し、配列に挿入すると便利です。

最初のセクションでは、プロパティファイル listOfValues でカンマ区切りの値を定義したため、配列の値は [“A”、 “B”、 ” C”]:

@Value("${listOfValues}")
private String[] valuesArray;

4. SpELを使用した高度な例

SpEL式を使用して値を取得することもできます。

priority、という名前のシステムプロパティがある場合、その値はフィールドに適用されます。

@Value("#{systemProperties['priority']}")
private String spelValue;

システムプロパティを定義していない場合は、null値が割り当てられます。

これを防ぐために、SpEL式にデフォルト値を指定できます。 システムプロパティが定義されていない場合、フィールドのデフォルトの値を取得します。

@Value("#{systemProperties['unknown'] ?: 'some default'}")
private String spelSomeDefault;

さらに、他のBeanのフィールド値を使用できます。 フィールドsomeValue10に等しいsomeBeanという名前のBeanがあるとします。 次に、10がフィールドに割り当てられます。

@Value("#{someBean.someValue}")
private Integer someBeanValue;

プロパティを操作して、値の List を取得できます。ここでは、文字列値A、B、およびCのリストを取得します。

@Value("#{'${listOfValues}'.split(',')}")
private List<String> valuesList;

5. @Valueマップで使用する

@Value アノテーションを使用して、Mapプロパティを挿入することもできます。

まず、プロパティファイルの {key:’value’}フォームでプロパティを定義する必要があります。

valuesMap={key1: '1', key2: '2', key3: '3'}

Mapの値は一重引用符で囲む必要があることに注意してください。

これで、プロパティファイルからこの値をMapとして挿入できます。

@Value("#{${valuesMap}}")
private Map<String, Integer> valuesMap;

マップで特定のキーの値を取得するためにが必要な場合は、にキーの名前を追加するだけです。

@Value("#{${valuesMap}.key1}")
private Integer valuesMapKey1;

Map に特定のキーが含まれているかどうかわからない場合は、例外をスローしないより安全な式を選択する必要がありますが、キーが見つからない場合は値をnullに設定します。 :

@Value("#{${valuesMap}['unknownKey']}")
private Integer unknownMapKey;

存在しない可能性のあるプロパティまたはキーのデフォルト値を設定することもできます

@Value("#{${unknownMap : {key1: '1', key2: '2'}}}")
private Map<String, Integer> unknownMap;

@Value("#{${valuesMap}['unknownKey'] ?: 5}")
private Integer unknownMapKeyWithDefaultValue;

マップエントリは、インジェクションの前にフィルタリングすることもできます。

値が1より大きいエントリのみを取得する必要があると仮定します。

@Value("#{${valuesMap}.?[value>'1']}")
private Map<String, Integer> valuesMapFiltered;

@Value アノテーションを使用して、現在のすべてのシステムプロパティを挿入することもできます。

@Value("#{systemProperties}")
private Map<String, String> systemPropertiesMap;

6. コンストラクタインジェクションで@Valueを使用する

@Value アノテーションを使用する場合、フィールドインジェクションに限定されません。 コンストラクタインジェクションと一緒に使用することもできます。

これを実際に見てみましょう:

@Component
@PropertySource("classpath:values.properties")
public class PriorityProvider {

    private String priority;

    @Autowired
    public PriorityProvider(@Value("${priority:normal}") String priority) {
        this.priority = priority;
    }

    // standard getter
}

上記の例では、priorityPriorityProviderのコンストラクターに直接挿入します。

プロパティが見つからない場合に備えて、デフォルト値も提供していることに注意してください。

7. @Valueをセッターインジェクションで使用

コンストラクターインジェクションと同様に、セッターインジェクションで@Valueを使用することもできます。

見てみましょう:

@Component
@PropertySource("classpath:values.properties")
public class CollectionProvider {

    private List<String> values = new ArrayList<>();

    @Autowired
    public void setValues(@Value("#{'${listOfValues}'.split(',')}") List<String> values) {
        this.values.addAll(values);
    }

    // standard getter
}

SpEL式を使用して、値のリストをsetValuesメソッドに挿入します。

8. 結論

この記事では、ファイルで定義された単純なプロパティ、システムプロパティ、およびSpEL式で計算されたプロパティで@Valueアノテーションを使用するさまざまな可能性を検討しました。

いつものように、サンプルアプリケーションはGitHubプロジェクトで利用できます。