Spring @Valueのクイックガイド

Spring @Valueのクイックガイド

1. 概要

この簡単な記事では、have a look at the @Value Spring annotationについて説明します。

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

参考文献:

Spring Beanとは何ですか?

Spring Beanとは何かについての迅速かつ実用的な説明。

Spring @Valueをデフォルトで使用する

Springで@Valueアノテーションを使用する場合のデフォルト値を設定するための迅速かつ実用的なガイド。

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のフィールド値を使用できます。 フィールドsomeValue10に等しい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;

Mapto 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で利用できます。