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"));
添加回答
举报