gpt4 book ai didi

java - Guice - MapBinder 的默认绑定(bind)

转载 作者:行者123 更新时间:2023-11-30 10:01:34 27 4
gpt4 key购买 nike

我正在使用 MapBinder 将键映射到它们各自的实现。现在我有这样的东西:

MapBinder<String, Processor> processor
= MapBinder.newMapBinder(binder(), String.class, Processor.class);
processor.addBinding("a1").to(a1Processor.class).in(Scopes.SINGLETON);
processor.addBinding("a2").to(a2Processor.class).in(Scopes.SINGLETON);
processor.addBinding("a3").to(a3Processor.class).in(Scopes.SINGLETON);

它按预期的方式工作。但是现在我正在考虑创建一个 DefaultProcessor 并将 a2a3 以外的任何 String 绑定(bind)到这个 默认处理器。可以这样做吗?

最佳答案

来自JavadocsMapBinder

An API to bind multiple map entries separately, only to later inject them as a complete map.

所以您在问题中提出的问题无法通过 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)。像这样的方法:

bind(Processor.class).annotatedWith(Names.named("default")).to(DefaultProcessor.class).in(Scopes.SINGLETON);

现在你可以注入(inject) StringProcessor包装器并使用它。

当您需要使用 Map 时,此建议很有值(value)在很多地方。对于单个类,您可以只注入(inject)默认值并在缺少 key 时使用它。

如果您只想使用 map 并避免添加单独的默认绑定(bind),您可以使用 "default" 在 MapBinder 中添加第四个绑定(bind)。键和 get StringProcessorWrapper的方法|做这样的事情:

processorMap.getOrDefault(key, processorMap.get("default"));

关于java - Guice - MapBinder 的默认绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57376904/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com