Guice-MapBinder的默认绑定

时间:2019-08-06 13:12:50

标签: java guice

我正在使用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并将Stringa2以外的任何a3绑定到此DefaultProcessor。可以这样做吗?

1 个答案:

答案 0 :(得分:1)

来自MapBinder的{​​{3}}

  

一个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时,此建议很有价值。对于单个类,您只需注入默认值,然后在缺少键时使用它即可。

如果您只想使用地图并避免添加单独的默认绑定,则可以使用"default"键和get的{​​{1}}方法在MapBinder中添加第4个绑定做这样的事情:

StringProcessorWrapper