java - 在 Java 中使用 MapBinder 提供多个绑定
问题描述
我正在使用 Google 的 MapBinders 将事件侦听器(我自己的自定义接口)映射到 EventType。
MapBinder<EventType, EventListener> eventEventHandlerMapBinder =
MapBinder.newMapBinder(binder(), EventType.class, EventListener.class);
eventEventHandlerMapBinder
.addBinding(EventType.DUMMY_EVENT)
.to(DummyListener.class);
这让我可以注入Map<EventType, Provider<EventListener>> eventEventHandlerMapBinder
我的 EventRegistry 或任何地方。我现在想将多个 EventListener 映射到一个事件类型,即对于 DUMMY_EVENT,我希望绑定 DummyListener.class 和 AnotherDummyListener.class。我怎么做?我不能这样做,因为 MapBinder 为 V 创建了一个提供程序:
MapBinder<EventType, List> eventEventHandlerMapBinder2 =
MapBinder.newMapBinder(binder(), EventType.class, List.class);
eventEventHandlerMapBinder2
.addBinding(EventType.DUMMY_EVENT)
.to((Key<? extends List>) Arrays.asList(DummyListener.class, AnotherDummyListener.class));
解决方案
您可以使用MapBinder
and的组合Multibinder
(但您需要从 to 切换List
,Set
但我想这应该不是问题)。这是一个简单的示例:
interface Service {
}
static class Service1 implements Service {
}
static class Service2 implements Service {
}
public static void main(String[] args) {
var injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
var multibinder = Multibinder.newSetBinder(binder(), Service.class);
multibinder.addBinding().to(Service1.class);
multibinder.addBinding().to(Service2.class);
var mapBinder = MapBinder.newMapBinder(binder(), new TypeLiteral<String>() {}, new TypeLiteral<Set<Service>>() {});
mapBinder.addBinding("foo").to(Key.get(new TypeLiteral<Set<Service>>(){}));
}
});
var map = injector.getInstance(Key.get(new TypeLiteral<Map<String, Set<Service>>>() {
}));
assert map.get("foo") != null;
}
要区分不同Set
的s,可以使用注解,例如@Named
/Names
或使用自定义的。
推荐阅读
- python - python-OpenCV中的Dlib模块错误是什么?
- php - 在视图 laravel 中显示来自 DB 数组的结果
- java - SQLiteOpenHelper 对查询没有响应
- c# - 更改在另一个 UserControl C#/WPF 中的 MainWindow 中显示哪个 UserControl
- java - 如何让杰克逊忽略构造函数属性
- java - Hibernate 5.2 CriteriaQuery 子查询
- r - 如何从 R 中的数据库中获取列名?
- javascript - 如何在 Vue.js 中渲染一组 html 代码
- angular - 想要在角度 6 中同时获取 id 和 value
- ruby-on-rails - rails 应用程序中内置的rails 和默认方法在哪里?