簡體   English   中英

在將Spring解析的屬性注入bean之前,如何對其進行修改

[英]How to modify properties resolved by Spring before their injection into beans

我需要為Spring應用程序中的外部屬性解密提供支持。 我計划使用spring-cloud-config中的一種機制,該機制在Environment准備就緒后觸發,並添加具有更高優先級的解密屬性。 不幸的是,它嚴重依賴於Spring Boot引導機制,該機制會發出ApplicationEnvironmentPreparedEvent 查看Spring Framework代碼,環境和上下文創建是高度耦合的,並且在它們之間運行我自己的代碼將相當困難。 我正在使用的應用程序是一個大型的,多模塊的“標准” Spring MVC應用程序,我現在不希望將其轉換為Spring引導應用程序。

問題

在Spring( 不是Spring Boot )應用程序中,在創建環境之后以及在創建上下文之前(在將屬性注入到“普通” bean中之前修改屬性)之前,我如何執行代碼?

替代問題

還有其他方法可以控制注入到bean中的屬性(用於修改最初由Spring解析的值)嗎?

您可以創建一個自定義ApplicationContextInitializer ,以向您選擇的PropertySource添加解密或其他內容。

我們在當前開發的應用程序中做了一些類似的事情。 從文件和數據庫加載一些自定義屬性后,我們將所有可用的PropertySource包裝在EncryptablePropertySource因為已加密了多個屬性(為此,我們使用Jasypt庫)。

在setter方法上使用@Value("${propname}")批注,而不是在字段上使用。

您可以編寫代碼來處理setter方法中的變換/驗證屬性,然后將其分配給該字段。

在平均時間我已經發現customizeContext在方法ContextLoader其中讀取定義ApplicationContextInitializer秒。 它是在創建環境之后且重新加載上下文之前執行的,因此初始化程序中的解密應該起作用(至少在基本情況下):

ConfigurableEnvironment env = wac.getEnvironment();
(...) 
customizeContext(sc, wac);
wac.refresh();

暫無
暫無

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

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