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
类吗?您使用了处理器
类。