亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在初始化時加載 Spring Boot 屬性并尊重所有屬性并根據屬性文件中的值控制

在初始化時加載 Spring Boot 屬性并尊重所有屬性并根據屬性文件中的值控制

富國滬深 2022-06-04 15:24:13
我們正在使用@PropertySources. 現在我想@Aspect基于屬性啟用/禁用。我嘗試使用@ConditionalOnExpressionwhich 不起作用。我通過創建一個propertyplaceholderconfig. 即使在相同的情況下,它也不起作用。然后我嘗試@profile了最初也沒有工作。我想出的是,這些變量在啟動時propertysource或propertyplaceholder在啟動時使用 bean 時并未初始化。某些變量總是被忽略,例如(logging.file)。但@Value工作正常。為了設置這些變量,我必須將它們作為 JVM 參數傳遞。所以我的問題是:1. 如何讓 spring 在啟動時始終讀取指定的屬性文件并尊重所有這些文件?2.這是啟用/禁用的最佳方式@Aspect。使用@profileor@ConditionalOnExpression還是別的什么?目前,我們logging.file在 main 方法中進行設置,因為它的行為方式也相同。但是你們知道這不是正確的方法,因為我最終可能會像這樣一個一個地添加屬性。我想將所有屬性放入外部文件中,以便 spring 讀取這些文件并設置其屬性。我們的物業結構:common.properties #這個有所有通用屬性service.properties #特定于服務的屬性。這還將包含來自 common.properties 的現有屬性,這些屬性將被覆蓋。我知道我可以使用個人資料。但是,我們希望將屬性保留在外部,如果您要更改屬性,則需要重新啟動服務。我也不想將變量作為 JVM 參數傳遞,然后我必須以這種方式傳遞大部分變量。傳遞 -Dspring.config.location 也很困難,common.properties因為service.properties每個服務都使用了“service.properties”文件名。
查看完整描述

1 回答

?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

似乎 Spring 默認會在初始化時加載一些屬性,除非您專門編寫邏輯來覆蓋它們(就像我在 中寫的那樣MainClass.java,否則沒有選項可以覆蓋這些屬性。其中一些包括(logging.file,@ConditionalonExpression 中使用的鍵)。

一些有自己挑戰的技巧:

  1. 在類路徑中指定屬性application.properties。在早期階段加載的變量總是從此文件中讀取。挑戰:我已將所有屬性緊密耦合到 jar 中,為了更改值,我必須重新編譯并重新啟動 Jar。

  2. 使用配置文件并定義application.propertiesapplication-profile.properties挑戰:我必須創建這么多配置文件,但之前的挑戰仍然存在。

  3. 將屬性值作為 JVM 參數傳遞為-Dproperty.key=value挑戰:認真嗎?我應該發送多少屬性作為 JVM 參數?

  4. 實現ApplicationContextInitialize和覆蓋initialize方法。挑戰:不建議覆蓋 Spring 的默認行為,并且僅將其用于讀取屬性文件是不是有點矯枉過正?

解決方案:

用于-Dspring.config.location指定屬性文件。在這種情況下,spring 總是只從指定的位置讀取屬性。您也可以提供多個屬性文件。有關更多詳細信息,請參閱此內容。如果您在目錄彈簧以相反的順序加載它們時給出屬性位置,似乎。但是,如果您指定文件,它將遵循指定的順序。

注意:所有這些都可以組合在一起。要了解優先級,請參閱此。


查看完整回答
反對 回復 2022-06-04
  • 1 回答
  • 0 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號