Java Guice-MapBinder的默认绑定

Java Guice-MapBinder的默认绑定,java,guice,Java,Guice,我正在使用MapBinder将键映射到它们各自的实现。现在我有这样的事情: MapBinder<String, Processor> processor = MapBinder.newMapBinder(binder(), String.class, Processor.class); processor.addBinding("a1").to(a1Processor.class).in(Scopes.SINGLETON);

我正在使用
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);
bind(Processor.class).annotatedWith(Names.named("default")).to(DefaultProcessor.class).in(Scopes.SINGLETON);
processorMap.getOrDefault(key, processorMap.get("default"));
MapBinder处理器
=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
,并将
a2
a3
以外的任何
字符串绑定到此
DefaultProcessor
。可以这样做吗?

MapBinder

用于单独绑定多个映射项的API,仅用于以后注入 它们就像一张完整的地图

因此,您在问题中提出的问题不可能通过MapBinder实现

尽管您可以围绕
映射编写包装器并使用它

建议:

@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);
    }
}
现在您可以插入
StringProcessor
包装器并使用它

当您需要在许多地方使用
地图时,此建议很有价值。对于单个类,您可以只注入默认值,并在缺少键时使用它

如果您只想使用映射并避免添加单独的默认绑定,可以使用
“default”
键在MapBinder中添加第四个绑定,并在
StringProcessorWrapper
get
方法中执行以下操作:

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);
bind(Processor.class).annotatedWith(Names.named("default")).to(DefaultProcessor.class).in(Scopes.SINGLETON);
processorMap.getOrDefault(key, processorMap.get("default"));

由于MapBinder为您提供了一张地图,您所需的是不可能的。你要求的是破坏Map的合同。它无法工作。感谢您的回复!要使用它,我只需要@Inject插入另一个类,并使用
get
方法将键作为参数传递,对吗?是的,您必须使用@Inject注入这个类。您还必须为默认处理器添加一个绑定。类似于
processor.addBinding(“default”).to(DefaultProcessor.class).in(Scopes.SINGLETON)对吗?不,这个是分开的。您的地图将只包含a1、a2、a3键。您必须执行类似于绑定(Processor.class).annotatedWith(Names.named(“default”)).to(DefaultProcessor.class).in(Scopes.SINGLETON)的操作
我不应该在
DefaultProcessor
变量和构造函数中使用
DefaultProcessor
类吗?您使用了
处理器
类。