Spring Bootの@ConfigurationPropertiesガイド

Spring Bootの@ConfigurationPropertiesのガイド

1. 前書き

Spring Bootの便利な機能の1つは、externalized configuration and easy access to properties defined in properties filesです。 以前のarticleは、これを実行できるさまざまな方法を説明していました。

次に、@ConfigurationPropertiesアノテーションについて詳しく説明します。

参考文献:

Spring @Valueのクイックガイド

Spring @Valueアノテーションを使用して、プロパティファイル、システムプロパティなどからフィールドを構成する方法を学びます。

SpringおよびSpring Bootのプロパティ

Springでプロパティファイルとプロパティ値を操作する方法のチュートリアル。

2. セットアップ

この記事では、かなり標準的なセットアップを使用しています。 まず、pom.xmlの親としてspring-boot-starter-parentを追加します。



    org.springframework.boot
    spring-boot-starter-parent
    2.1.3.RELEASE
     

ファイルで定義されたプロパティを検証するには、JSR-303の実装も必要です。 hibernate-validatorはその1つです。

それをpom.xmlにも追加しましょう:


   org.hibernate
   hibernate-validator
   6.0.16.Final

getting started with Hibernate Validatorページに詳細があります。

3. シンプルなプロパティ

公式ドキュメントでは、構成プロパティを個別のPOJO.に分離することを推奨しています

それでは、それを行うことから始めましょう:

@Configuration
@PropertySource("classpath:configprops.properties")
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {

    private String hostName;
    private int port;
    private String from;

    // standard getters and setters
}

SpringがアプリケーションコンテキストでSpringBeanを作成するように、@Configurationを使用します。

また、@PropertySourceを使用してプロパティファイルの場所を定義します。 それ以外の場合、Springはデフォルトの場所(classpath:application.properties)を使用します。

@ConfigurationProperties works best with hierarchical properties that all have the same prefix.したがって、mailのプレフィックスを追加します。

Springフレームワークは標準のJava Beanセッターを使用するため、各プロパティのセッターを宣言することが不可欠です。

注:POJOで@Configuration を使用しない場合は、メインのSpringアプリケーションクラスに@EnableConfigurationProperties(ConfigProperties.class) を追加して、プロパティをPOJOにバインドする必要があります。

@SpringBootApplication
@EnableConfigurationProperties(ConfigProperties.class)
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

それでおしまい! Spring will automatically bind any property defined in our property file that has the prefix mail and the same name as one of the fields in the ConfigProperties class

Springは、プロパティのバインドにいくつかの緩和されたルールを使用します。 したがって、次のバリエーションはすべてプロパティhostNameにバインドされます。

mail.hostName
mail.hostname
mail.host_name
mail.host-name
mail.HOST_NAME

次のプロパティファイルを使用して、すべてのフィールドを設定できます。

#Simple properties
[email protected]
mail.port=9000
[email protected]

4. ネストされたプロパティ

Lists, Maps,Classes.にネストされたプロパティを持つことができます

いくつかのネストされたプロパティに使用する新しいCredentialsクラスを作成しましょう。

public class Credentials {
    private String authMethod;
    private String username;
    private String password;

    // standard getters and setters
}

また、List,Map、およびCredentialsクラスを使用するようにConfigPropertiesクラスを更新します。

public class ConfigProperties {

    private String host;
    private int port;
    private String from;
    private List defaultRecipients;
    private Map additionalHeaders;
    private Credentials credentials;

    // standard getters and setters
}

次のプロパティファイルは、すべてのフィールドを設定します。

#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

5. @Beanメソッドで@ConfigurationPropertiesを使用する

@Beanアノテーション付きメソッドで@ConfigurationPropertiesアノテーションを使用することもできます。

このアプローチは、プロパティを制御できないサードパーティコンポーネントにバインドする場合に特に役立ちます。

次の例で使用する単純なItemクラスを作成しましょう。

public class Item {
    private String name;
    private int size;

    // standard getters and setters
}

次に、@Beanメソッドで@ConfigurationPropertiesを使用して、外部化されたプロパティをItemインスタンスにバインドする方法を見てみましょう。

@Configuration
public class ConfigProperties {

    @Bean
    @ConfigurationProperties(prefix = "item")
    public Item item() {
        return new Item();
    }
}

このように、アイテムのプレフィックスが付いたプロパティは、Springコンテキストによって管理されるItemインスタンスにマッピングされます。

6. プロパティの検証

@ConfigurationProperties provides validation of properties using the JSR-303 format.これにより、あらゆる種類のきちんとしたことが可能になります。

たとえば、hostNameプロパティを必須にしましょう。

@NotBlank
private String hostName;

また、1〜4文字の長さのauthMethodプロパティ:

@Length(max = 4, min = 1)
private String authMethod;

そして、1025から65536までのportプロパティ:

@Min(1025)
@Max(65536)
private int port;

最後に、fromプロパティは電子メールアドレスの形式と一致する必要があります。

@Pattern(regexp = "^[a-z0-9._%+-][email protected][a-z0-9.-]+\\.[a-z]{2,6}$")
private String from;

これにより、コード内の多くのif – else条件が削減され、よりクリーンで簡潔に見えるようになります。

If any of these validations fail then the main application would fail to start with an IllegalStateException

Hibernate Validationフレームワークは標準のJavaBeanゲッターとセッターを使用するため、プロパティごとにゲッターとセッターを宣言することが重要です。

7. プロパティ変換

@ConfigurationPropertiesは、プロパティを対応するBeanにバインドするための複数のタイプの変換をサポートします。

7.1. Duration

プロパティをDurationオブジェクト.に変換することから始めます。

ここに、タイプDurationの2つのフィールドがあります。

@ConfigurationProperties(prefix = "conversion")
public class PropertyConversion {

    private Duration timeInDefaultUnit;
    private Duration timeInNano;
    ...
}

そして、プロパティファイル:

conversion.timeInDefaultUnit=10
conversion.timeInNano=9ns

その結果、フィールドtimeInDefaultUnitの値は10ミリ秒になり、timeInNanoの値は9ナノ秒になります。

サポートされる単位は、ナノ秒、マイクロ秒、ミリ秒、秒、分、時間、および日をそれぞれns, us, ms, s, m, hおよびdです。

デフォルトの単位はミリ秒です。つまり、数値の横に単位を指定しない場合、Springは値をミリ秒に変換します。

@DurationUnit:を使用してデフォルトの単位をオーバーライドすることもできます

@DurationUnit(ChronoUnit.DAYS)
private Duration timeInDays;

および対応するプロパティ:

conversion.timeInDays=2

7.2. DataSize

同様に、Spring Boot@ConfigurationPropertiesDataSize型変換をサポートしています。

タイプDataSizeの3つのフィールドを追加しましょう:

private DataSize sizeInDefaultUnit;

private DataSize sizeInGB;

@DataSizeUnit(DataUnit.TERABYTES)
private DataSize sizeInTB;

および対応するプロパティ:

conversion.sizeInDefaultUnit=300
conversion.sizeInGB=2GB
conversion.sizeInTB=4

この場合、デフォルトの単位はバイトであるため、sizeInDefaultUnitの値は300バイトになります。

サポートされている単位はB, KB, MB, GBTB.です。@DataSizeUnit.を使用してデフォルトの単位を上書きすることもできます。

7.3. カスタムConverter

プロパティを特定のクラスタイプに変換することをサポートするために、独自のカスタムConverterを追加することもできます。

単純なクラスEmployeeを追加しましょう:

public class Employee {
    private String name;
    private double salary;
}

そして、このプロパティを変換するカスタムコンバーターを作成します。

conversion.employee=john,2000

タイプEmployeeのフィールドへ:

private Employee employee;

Converterインターフェースを実装してから、use @ConfigurationPropertiesBinding annotation to register our custom*Converter*:を実装する必要があります。

@Component
@ConfigurationPropertiesBinding
public class EmployeeConverter implements Converter {

    @Override
    public Employee convert(String from) {
        String[] data = from.split(",");
        return new Employee(data[0], Double.parseDouble(data[1]));
    }
}

8. 結論

@ConfigurationPropertiesアノテーションを調べて、緩和されたバインディングやBeanValidationなどの便利な機能のいくつかを見てきました。

いつものように、コードはover on Githubで利用できます。