[英]Spring create list of beans based on properties
在一個簡單的 Spring 啟動應用程序中,我的組件如下所示:
@Data
@Component
public class GenericHandler {
private String path;
private HandlerType type;
}
我的屬性可能如下所示:
my.handlers[0].path='/vol1/abc'
my.handlers[0].type='Single'
my.handlers[1].path='/vol1/dora'
my.handlers[1].type='MultiSequence'
我嘗試使用帶有@ConfigurationProperties(prefix="my.handlers")
的GenericHandler 類進行裝飾,並使用獲取服務中所有組件實例的列表
@Autowired
private List<GenericHandler> handlers;
但這只創建了一個組件,完全忽略了屬性值。
如何根據my.handlers
屬性條目獲取一個組件實例?
@Component
@ConfigurationProperties(prefix="my.handlers")
@Data
public class GenericHandlerWrapper {
private List<GenericHandler> handlers;
...
}
autowire
GenericHandlerWrapper
更新
@zoolway
在評論中指出的那樣,要使問題中的屬性按原樣工作,應將@ConfigurationProperties(prefix="my.handlers")
更改為@ConfigurationProperties(prefix="my")
那是不可能的。 可以做的是:
@Data
@Component
public class GenericHandler {
private List<String> path;
private List<HandlerType> type;
}
我以不同的方式處理了類似的問題。 我創建了一個工廠和一個接口。 工廠將持有該接口的不同實現在您的情況下, GenericHandler
將是您的接口。 然后你編寫任意數量的接口實現,每個實現都被聲明為一個組件。 因此,Spring 將在啟動時將其實例化為 bean(您可能會使用@Lazy(false)
強制在啟動時實例化),使用我編寫的一些基礎設施,該接口的每個 bean 都會自行插入到其工廠中。 然后在任何 bean 中代碼的任何部分,您都可以使用工廠訪問具體實現(例如,基於您的屬性“類型”)。 美妙之處在於您不需要在編寫時將所有實現注入到您的 bean 中,而是在運行時動態訪問所需的實現。 我發現這是一個有用的模式,並創建了一個為您完成大部分工作的基礎架構,並將其發布為一個名為 MgntUtils 的開源庫。 可以在此處找到該想法的詳細描述(包括對庫的引用)。 還可以在此處的庫 Javadoc 中找到有關如何使用它的示例的詳細說明。 該庫以Maven 工件和Github的形式提供(帶有源代碼和 Javadoc)。 也可以在此處找到有關 MgntUtils 庫的一般文章
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.