簡體   English   中英

Spring Profiles 應用程序屬性順序

[英]Spring Profiles application properties order

我們有很多環境都有多個活動的 Spring 配置文件,但是 application-{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。 你有這些屬性文件:

應用程序.yml:

property1: bob
property2: alice
property3: eve

應用程序-profile1.yml:

property2: alice1
property3: eve1

應用程序-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 strategy

如果指定了多個配置文件,則采用最后獲勝的策略。

因此,如果我們有以下代碼並且排除了所有其他選項:

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

application-dev.propertiesapplication-prod.properties文件都被加載,后一個(生產)中同名的鍵覆蓋了前一個。

我發布了關於配置文件訂單處理的重要通知。 此處查看此過程中如何處理 jar 資源文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM