1 回答

TA貢獻1876條經驗 獲得超5個贊
從Javadocs的MapBinder
一個單獨綁定多個映射條目的 API,只是稍后將它們作為完整的映射注入。
因此,您在問題中提出的問題無法通過 MapBinder 實現。
盡管您可以圍繞 編寫一個包裝器Map<String, Processor>
并使用它。
建議:
@Singleton
class StringProcessorWrapper {
? ? private final Map<String, Processor> processorMap;
? ? private final Processor defaultProcessor;
? ? @Inject
? ? public StringProcessorWrapper(Map<String, Processor> processorMap, @Named("default") Processor defaultProcessor) {
? ? ? ? this.processorMap = processorMap;
? ? ? ? this.defaultProcessor = defaultProcessor;
? ? }
? ? public Processor get(String key) {
? ? ? ? return processorMap.getOrDefault(key, defaultProcessor);
? ? }
}
為此,您必須在 guice 模塊的configure方法中添加一個綁定,如下所示:
bind(Processor.class).annotatedWith(Names.named("default")).to(DefaultProcessor.class).in(Scopes.SINGLETON);
現在您可以注入StringProcessor包裝器并使用它。
Map當你需要在很多地方使用時,這個建議很有價值。對于單個類,您可以只注入默認值并在缺少密鑰時使用它。
如果您只想使用地圖并避免添加單獨的默認綁定,您可以在 MapBinder 中使用鍵添加第四個綁定,"default"并在get方法中StringProcessorWrapper執行如下操作:
processorMap.getOrDefault(key, processorMap.get("default"));
添加回答
舉報