Spring Bootの@ConfigurationPropertiesガイド
1前書き
Spring Bootの便利な機能の1つは、外部化された設定と、プロパティファイルで定義されたプロパティへの簡単なアクセスです。
以前のリンク:/properties-with-spring[article]は、これを行うことができるさまざまな方法を説明していました。この記事では、
@ ConfigurationProperties
アノテーションについてさらに詳しく説明します。
2セットアップ
この記事の設定はかなり標準的です。まず、
pom.xml
に親として
spring-boot-starter-parent
を追加します。
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
Spring Bootの最新版は、中央のhttps://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent[ここ]にあります。
ファイルに定義されているプロパティを検証できるようにするには、JSR-303の実装が必要です。
hibernate-validator
はそのうちの1つです。
それを私たちの
pom.xml
にも追加しましょう。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
アプリケーションの種類と実行している環境によっては、1つ以上の依存関係を追加する必要があるかもしれません。
reference
ページに同じことについての詳細があり、
hibernate-validator
の最新版はhttps://mvnrepository.com/artifact/orgにあります。 hibernate/hibernate-validator[ここ]。
このアノテーションの全機能を理解するために、メールサーバに関連する設定プロパティを持つ仮想クラスの例を取ります。
public class ConfigProperties {
public static class Credentials {
private String authMethod;
private String username;
private String password;
//standard getters and setters
}
private String host;
private int port;
private String from;
private Credentials credentials;
private List<String> defaultRecipients;
private Map<String, String> additionalHeaders;
//standard getters and setters
}
3設定プロパティのバインド
-
公式ドキュメントによると、設定プロパティを
@ ConfigurationProperties
** のアノテーションが付けられた別のPOJOに分離することをお勧めします。それでは、まず始めに
@Configuration
@ConfigurationProperties
public class ConfigProperties {
//previous code
}
また、Springに
@ Configuration
アノテーションを追加して、このBeanを見つけてインジェクションの候補にできるようにしました。
アノテーションは、すべて同じプレフィックスを持つ階層プロパティがある場合に最も効果的に機能するので、プレフィックスもアノテーションの一部として説明します。
これらのプロパティを格納するカスタムソースをオプションで定義することもできます。そうしないと、デフォルトの場所(
classpath:application.properties
)が検索されます。そこで、今度は上記のアノテーションを既存のプロパティクラスに追加します。
@Configuration
@PropertySource("classpath:configprops.properties")
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
//previous code
}
-
それだけです!** プロパティファイルで定義されたプロパティのうち、接頭辞
mail
とプロパティの1つと同じ名前を持つものは、自動的にこのオブジェクトに割り当てられます。
また、デフォルトでは、緩やかなバインディングスキームがバインディングに採用されているので、以下のバリエーションはすべて
Credentials
クラスのプロパティ
authMethod
にバインドされます。
mail.credentials.auth__method
mail.credentials.auth-method
mail.credentials__AUTH__METHOD
mail.CREDENTIALS__AUTH__METHOD
同様に、
List
および
Map
プロパティもバインドできます。これは、前に定義した
ConfigProperties
オブジェクトに正しくバインドするサンプルのプロパティファイルです。
#Simple properties[email protected]mail.port=9000[email protected]
#List properties
mail.defaultRecipients[0][email protected]mail.defaultRecipients[1][email protected]
#Map Properties
mail.additionalHeaders.redelivery=true
mail.additionalHeaders.secure=true
#Object properties
mail.credentials.username=john
mail.credentials.password=password
mail.credentials.authMethod=SHA1
4プロパティ検証
このアノテーションが提供する便利なことの1つは、JSR-303フォーマットを使用したプロパティの検証です。これは、プロパティが
null
ではないことをチェックするなど、あらゆる種類のきれいなことを可能にします。
@NotBlank
private String host;
String
プロパティの最小長と最大長も確認できます。
@Length(max = 4, min = 1)
private String authMethod;
あるいは、
Integer
プロパティの最小値と最大値を強制します。
@Min(1025)
@Max(65536)
private int port;
そして最後に、同じ正規表現を定義することで、プロパティが特定のパターンに一致することを確認することもできます。例として、これは電子メールに対して行われました。
@Pattern(regexp = "^[a-z0-9.__%+-][email protected][a-z0-9.-]+\\.[a-z]{2,6}$")
private String from;
これにより、コード内のさまざまな
if – else
条件を減らすことができ、非常にきれいで簡潔に見えます。
-
これらの検証のいずれかが失敗した場合、メインアプリケーションは不正なプロパティが修正されるまで
IllegalStateException
** で起動できません。
また、関連するプロパティにアクセスするためにバリデータフレームワークによって使用されるため、各プロパティに対してゲッターとセッターを宣言することも重要です。
5結論
このクイックチュートリアルでは、@ @ ConfigurationProperties__アノテーションを調べ、リラックスバインディングやBean Validationなどの便利な機能もいくつか紹介しました。
いつものように、コードはhttps://github.com/eugenp/tutorials/tree/master/spring-boot[Githubで利用可能]です。