複数のアクティブな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に変更されましたか?あるようです。
プロファイルのプロパティは、指定した順序と同じ順序で読み込まれます。同じプロパティが異なるプロファイルで定義されている場合は、最後のプロパティが優先されます。
この動作は、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
まず、すべてのアクティブなプロファイルの最終セットを見つける必要があります。 アクティブプロファイルの設定/置換とアクティブプロファイルの追加にはいくつかの方法があります既存のアクティブなものの上。たとえば、spring.profiles.active
プロパティで設定されたアクティブなプロファイルは、-Dspring.profiles.active
コマンドラインオプションに置き換えられます。 (そして、これは本当に複雑になる可能性があります。)
一方、SpringApplicationBuilder's
profiles
メソッドは、既存のアクティブなプロファイルに追加されます。次のコードを使用して、アクティブなプロファイルの最終セットを把握できます。
@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
ファイルの両方がロードされ、後者(本番)の同じ名前のキーが前者のキーをオーバーライドします。