web-dev-qa-db-ja.com

SpringProfilesアプリケーションのプロパティの順序

複数のアクティブなSpringプロファイルを持つ多くの環境がありますが、アプリケーションの優先順位は何ですか-{profile} .ymlファイル?

私が持っている場合spring.profiles.active=test-us-west-2-p1, test-us-west-2, test

ファイルはどのような順序で実行されますかapplication-test.yml, application-test-us-west-2.yml, application-test-us-west-2-p1.ymlロードされますか?各ファイルに同じプロパティがある場合、どちらが「勝ち」ますか?

また、これはSpring-Boot 1.5.xから2.xに変更されましたか?あるようです。

7
Gandalf

プロファイルのプロパティは、指定した順序と同じ順序で読み込まれます。同じプロパティが異なるプロファイルで定義されている場合は、最後のプロパティが優先されます。

この動作は、Spring Bootバージョン1.5.xと2.xの両方に適用され、正しく思い出せば、Springのすべてのバージョンに適用されます。

Springは常にappication.ymlをロードします。その後、プロファイルが指定されている場合は、そのプロファイルのプロパティファイルが読み込まれます。そして、そのプロファイルの後に別のプロファイルが指定されている場合、そのプロファイルのプロパティファイルが読み込まれます。現在のプロパティの値を常に新しいプロパティで上書きします。

したがって、profile1とprofile2があるとします。そして、あなたはこれらのプロパティファイルを持っています:

application.yml:

property1: bob
property2: alice
property3: eve

application-profile1.yml:

property2: alice1
property3: eve1

application-profile2.yml:

property3: eve2

そして、次のコマンドでアプリケーションを開始します:spring.profiles.active=profile1, profile2

あなたは得るでしょう:

property1: bob
property2: alice1
property3: eve2
13
f-CJ

まず、すべてのアクティブなプロファイルの最終セットを見つける必要があります。 アクティブプロファイルの設定/置換アクティブプロファイルの追加にはいくつかの方法があります既存のアクティブなものの上。たとえば、spring.profiles.activeプロパティで設定されたアクティブなプロファイルは、-Dspring.profiles.activeコマンドラインオプションに置き換えられます。 (そして、これは本当に複雑になる可能性があります。)

一方、SpringApplicationBuilder'sprofilesメソッドは、既存のアクティブなプロファイルに追加されます。次のコードを使用して、アクティブなプロファイルの最終セットを把握できます。

@Autowired
private Environment environment;

...

System.out.println("Active profiles: " +
        Arrays.toString(environment.getActiveProfiles()));

ここで、Springドキュメントが何を呼び出すかを検討する必要がありますlast-wins戦略

複数のプロファイルが指定されている場合は、ラストウィン戦略が適用されます。

したがって、次のコードと他のすべてのオプションが除外されている場合:

new SpringApplicationBuilder(Application.class)
        .profiles("dev", "prod")
        .run(args);

application-dev.propertiesファイルとapplication-prod.propertiesファイルの両方がロードされ、後者(本番)の同じ名前のキーが前者のキーをオーバーライドします。

0
Jan Bodnar