为了账号安全,请及时绑定邮箱和手机立即绑定

Guice - MapBinder 的默认绑定

Guice - MapBinder 的默认绑定

Helenr 2023-05-17 15:49:25
我正在使用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
查看完整描述

1 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

JavadocsMapBinder

一个单独绑定多个映射条目的 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"));


查看完整回答
反对 回复 2023-05-17
  • 1 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信