在 Java 中使用 MapBinder 提供多个绑定

Provide multiple bindings using MapBinder in Java

我正在使用 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 或任何地方。 我现在想将多个 EventListeners 映射到一个事件类型,即对于 DUMMY_EVENT,我希望绑定 DummyListener.class 和另一个 DummyListener.class。我怎么做? 我不能这样做,因为 MapBinder 为 V:

创建了一个 Provider
    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));

您可以使用 MapBinderMultibinder 的组合(但您需要从 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,您可以使用注释,例如@Named/Names或使用自定义的。