How do I bind Different Interfaces using Google Guice?

寵の児 提交于 2019-12-01 06:31:50
Jesse Wilson

Take looks like the Robot Legs section, described in the Guice FAQ. "How to create a robot with a two Leg objects, the left one injected with a LeftFoot, and the right one with a RightFoot." But only one Leg class that's reused in both contexts.

There's a PrivateModules solution. It uses two separate private modules, a @Left one and an @Right one. Each has a binding for the unannotated Foot.class and Leg.class, and exposes a binding for the annotated Leg.class:

class LegModule extends PrivateModule {
  private final Class<? extends Annotation> annotation;

  LegModule(Class<? extends Annotation> annotation) {
    this.annotation = annotation;
  }

  @Override protected void configure() {
    bind(Leg.class).annotatedWith(annotation).to(Leg.class);
    expose(Leg.class).annotatedWith(annotation);

    bindFoot();
  }

  abstract void bindFoot();
}

...and to glue it all together:

  public static void main(String[] args) {
    Injector injector = Guice.createInjector(
        new LegModule(Left.class) {
          @Override void bindFoot() {
            bind(Foot.class).toInstance(new Foot("leftie"));
          }
        },
        new LegModule(Right.class) {
          @Override void bindFoot() {
            bind(Foot.class).toInstance(new Foot("righty"));
          }
        });
  }

How do you decide which FortuneService implementation is required for Chef?You can not bind the same interface to different implementations without a way for Guice to differentiate between the two. You have to use something like this.

bind(FortuneService.class).annotatedWith(Names.named("1").to(FortuneServiceImpl.class);
bind(FortuneService.class).annotatedWith(Names.named("2").to(FortuneServiceImpl2.class);

For more information, see here

I think you can use the @Provides annotation. See here.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!