1. 概要

Spring Bootの一般的な方法は、外部構成を使用してプロパティを定義することです。 これにより、異なる環境で同じアプリケーションコードを使用できます。

プロパティファイル、YAMLファイル、環境変数、コマンドライン引数を使用できます。

この短いチュートリアルでは、プロパティとYAMLファイルの主な違いについて説明します。

2. プロパティの構成

デフォルトでは、SpringBootはapplication.propertiesファイルで設定された構成にアクセスできます。このファイルはキー値形式を使用します。

spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
spring.datasource.password=password

ここでは、各行が1つの構成であるため、キーに同じプレフィックスを使用して階層データを表現する必要があります。 この例では、すべてのキーがspring.datasourceに属しています。

2.1. プロパティのプレースホルダー

値の範囲内で、 $ {} 構文のプレースホルダーを使用して、他のキー、システムプロパティ、または環境変数の内容を参照できます。

app.name=MyApp
app.description=${app.name} is a Spring Boot application

2.2. リスト構造

値が異なる同じ種類のプロパティがある場合は、配列インデックスを使用してリスト構造を表すことができます。

application.servers[0].ip=127.0.0.1
application.servers[0].path=/path1
application.servers[1].ip=127.0.0.2
application.servers[1].path=/path2
application.servers[2].ip=127.0.0.3
application.servers[2].path=/path3

2.3. 複数のプロファイル

バージョン2.4.0以降、SpringBootはマルチドキュメントプロパティファイルの作成をサポートしています。 簡単に言えば、1つの物理ファイルを複数の論理ドキュメントに分割できます。

これにより、宣言する必要のあるプロファイルごとに、すべて同じファイルでドキュメントを定義できます。

logging.file.name=myapplication.log
bael.property=defaultValue
#---
spring.config.activate.on-profile=dev
spring.datasource.password=password
spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
bael.property=devValue
#---
spring.config.activate.on-profile=prod
spring.datasource.password=password
spring.datasource.url=jdbc:h2:prod
spring.datasource.username=prodUser
bael.property=prodValue

‘#—‘表記を使用して、ドキュメントを分割する場所を示していることに注意してください。

この例では、異なるプロファイルがタグ付けされた2つのspringセクションがあります。 また、ルートレベルで共通のプロパティセットを設定できます。この場合、logging.file.nameプロパティはすべてのプロファイルで同じになります。

2.4. 複数のファイルにまたがるプロファイル

同じファイルに異なるプロファイルを含める代わりに、異なるファイルに複数のプロファイルを保存できます。 バージョン2.4.0より前では、これはプロパティファイルで使用できる唯一の方法でした。

これを実現するには、プロファイルの名前をファイル名に入れます(たとえば、 application-dev.ymlまたはapplication-dev.properties)。

3. YAML構成

3.1. YAML形式

Javaプロパティファイルだけでなく、SpringBootアプリケーションでYAMLベースの構成ファイルを使用することもできます。 YAMLは、階層構成データを指定するための便利な形式です。

次に、プロパティファイルから同じ例を取り出して、YAMLに変換しましょう。

spring:
    datasource:
        password: password
        url: jdbc:h2:dev
        username: SA

これは、繰り返されるプレフィックスが含まれていないため、プロパティファイルの代替よりも読みやすくなります。

3.2. リスト構造

YAMLには、リストを表現するためのより簡潔な形式があります。

application:
    servers:
    -   ip: '127.0.0.1'
        path: '/path1'
    -   ip: '127.0.0.2'
        path: '/path2'
    -   ip: '127.0.0.3'
        path: '/path3'

3.3. 複数のプロファイル

プロパティファイルとは異なり、YAMLは設計上マルチドキュメントファイルをサポートしているため、使用するSpring Bootのバージョンに関係なく、同じファイルに複数のプロファイルを保存できます。

ただし、この場合、仕様では、 3つのダッシュを使用して、新しいドキュメントの開始を示す必要があることが示されています。

logging:
  file:
    name: myapplication.log
---
spring:
  config:
    activate:
      on-profile: staging
  datasource:
    password: 'password'
    url: jdbc:h2:staging
    username: SA
bael:
  property: stagingValue

注:予期しない結果が生じる可能性があるため、通常、標準のapplication.propertiesファイルとapplication.ymlファイルの両方を同時にプロジェクトに含めたくありません。

たとえば、上記のプロパティ( application.yml ファイル内)をセクション2.3で説明したプロパティと組み合わせると、bael.propertyが割り当てられます。プロファイル固有の値ではなく、defaultValue。 これは、 application.properties が後で読み込まれ、その時点までに割り当てられた値が上書きされるためです。

4. スプリングブートの使用法

構成を定義したので、それらにアクセスする方法を見てみましょう。

4.1. 注釈

@Value アノテーションを使用して、プロパティの値を挿入できます。

@Value("${key.something}")
private String injectedProperty;

ここで、プロパティ key.something は、フィールドインジェクションを介してオブジェクトの1つに注入されます。

4.2. 環境抽象化

EnvironmentAPIを使用してプロパティの値を取得することもできます。

@Autowired
private Environment env;

public String getSomeKey(){
    return env.getProperty("key.something");
}

4.3. ConfigurationPropertiesアノテーション

最後に、 @ConfigurationProperties アノテーションを使用して、プロパティをタイプセーフな構造化オブジェクトにバインドすることもできます。

@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
    String name;
    String description;
...

5. 結論

この記事では、プロパティ ymlSpring Boot構成ファイルの間にいくつかの違いがあります。 また、それらの値が他のプロパティをどのように参照できるかを見ました。 最後に、ランタイムに値を挿入する方法を確認しました。

いつものように、すべてのコード例はGitHubから入手できます。