猿问

Guice - MapBinder 的默认绑定

我正在使用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并绑定除thisString之外的任何其他内容。是否有可能做到这一点?a2a3DefaultProcessor


Helenr
浏览 123回答 1
1回答

慕运维8079593

从Javadocs的MapBinder一个单独绑定多个映射条目的 API,只是稍后将它们作为完整的映射注入。因此,您在问题中提出的问题无法通过 MapBinder 实现。尽管您可以围绕 编写一个包装器Map<String, Processor>并使用它。建议:@Singletonclass 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"));
随时随地看视频慕课网APP

相关分类

Java
我要回答