簡體   English   中英

Spring 根據屬性創建 bean 列表

[英]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屬性條目獲取一個組件實例?

  • 你需要一個包裝器 class
    @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.

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