[英]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.properties
和application-prod.properties
文件都被加載,后一個(生產)中同名的鍵覆蓋了前一個。
我發布了關於配置文件訂單處理的重要通知。 在此處查看此過程中如何處理 jar 資源文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.