Spring @Valueのクイックガイド
1. 概要
この簡単な記事では、have a look at the @Value Spring annotationについて説明します。
この注釈は、Spring管理Beanのフィールドに値を注入するために使用でき、フィールドまたはコンストラクター/メソッドパラメーターレベルで適用できます。
参考文献:
2. アプリケーションのセットアップ
この注釈のさまざまな種類の使用法を説明するには、単純なSpringアプリケーション構成クラスを構成する必要があります。
そして当然、we’ll need a properties fileは、@Valueアノテーションで注入する値を定義します。 そのため、最初に構成クラスで@PropertySourceをプロパティファイル名で定義する必要があります。
プロパティファイルを定義しましょう:
value.from.file=Value got from the file
priority=Properties file
listOfValues=A,B,C
3. 使用例
基本的でほとんど役に立たない使用例として、注釈からフィールドに「文字列値」のみを挿入できます。
@Value("string value")
private String stringValue;
@PropertySourceアノテーションを使用すると、@Valueアノテーションを使用してプロパティファイルの値を操作できます。 次の例では、フィールドに割り当てられた“Value got from the file”を取得します。
@Value("${value.from.file}")
private String valueFromFile;
同じ構文を使用して、システムプロパティから値を設定することもできます。 systemValueという名前のシステムプロパティを定義したと仮定して、次のサンプルを見てみましょう。
@Value("${systemValue}")
private String systemValue;
定義されていない可能性のあるプロパティには、デフォルト値を提供できます。 この例では、値“some default”が注入されます。
@Value("${unknown.param:some default}")
private String someDefault;
同じプロパティがシステムプロパティとして、およびプロパティファイルで定義されている場合、システムプロパティが適用されます。
プロパティpriorityが値“System property”のシステムプロパティとして定義され、プロパティファイルで他の何かとして定義されているとします。 次のコードでは、値は“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式にデフォルト値を指定できます。 次の例では、システムプロパティが定義されていない場合、フィールドの“some default”値を取得します。
@Value("#{systemProperties['unknown'] ?: 'some default'}")
private String spelSomeDefault;
さらに、他のBeanのフィールド値を使用できます。 フィールドsomeValueが10に等しいsomeBeanという名前のBeanがあるとします。 次に、10がこの例のフィールドに割り当てられます。
@Value("#{someBean.someValue}")
private Integer someBeanValue;
プロパティを操作して、Listの値を取得できます。 次のサンプルでは、文字列値A、B、およびCのリストを取得します。
@Value("#{'${listOfValues}'.split(',')}")
private List valuesList;
5. Mapsで@Valueを使用する
@Valueアノテーションを使用して、Mapプロパティを挿入することもできます。
まず、プロパティファイルの\{key: ‘value' } formでプロパティを定義する必要があります。
valuesMap={key1: '1', key2: '2', key3: '3'}
Mapの値は一重引用符で囲む必要があることに注意してください。
これで、プロパティファイルからこの値をMapとして挿入できます。
@Value("#{${valuesMap}}")
private Map valuesMap;
Mapにto get the value of a specific keyが必要な場合、必要なのはadd the key’s name in the expressionだけです。
@Value("#{${valuesMap}.key1}")
private Integer valuesMapKey1;
Mapに特定のキーが含まれているかどうかわからない場合は、キーが見つからないときにa safer expression that will not throw an exception but set the value to nullを選択する必要があります。
@Value("#{${valuesMap}['unknownKey']}")
private Integer unknownMapKey;
set default values for the properties or keys that might not existも可能です:
@Value("#{${unknownMap : {key1: '1', key2: '2'}}}")
private Map unknownMap;
@Value("#{${valuesMap}['unknownKey'] ?: 5}")
private Integer unknownMapKeyWithDefaultValue;
注入前のMap entries can also be filtered。 値が1より大きいエントリのみを取得する必要があると仮定します。
@Value("#{${valuesMap}.?[value>'1']}")
private Map valuesMapFiltered;
inject all current system properties:に@Valueアノテーションを使用することもできます
@Value("#{systemProperties}")
private Map systemPropertiesMap;
6. 結論
このクイックチュートリアルでは、ファイルで定義された単純なプロパティ、システムプロパティ、およびSpEL式で計算されたプロパティで@Valueアノテーションを使用するさまざまな可能性を検討しました。
いつものように、サンプルアプリケーションはon GitHub projectで利用できます。