Java 使用Guice和提供程序对服务进行多个实现

Java 使用Guice和提供程序对服务进行多个实现,java,guice,Java,Guice,我需要一个关于如何使用GoogleGuice为一个服务的多个实现编码的建议。下面是一个例子 TestService TestService=newtestserviceinmplone(); TestService TestService=新的TestServiceImplTwo(); As GUI不允许将一个类型绑定到多个实现,因为下面的代码会导致错误 binderObject.bind(SomeType.class).to(implementionOne.class); binderObj

我需要一个关于如何使用GoogleGuice为一个服务的多个实现编码的建议。下面是一个例子

TestService TestService=newtestserviceinmplone();
TestService TestService=新的TestServiceImplTwo();
As GUI不允许将一个类型绑定到多个实现,因为下面的代码会导致错误

binderObject.bind(SomeType.class).to(implementionOne.class);
binderObject.bind(SomeType.class).to(implementationtwo.class);
我们可以通过如下命名注释来解决这个问题

binder.bind(Player.class).notatedWith(Names.named(“Good”)).to(GoodPlayer.class);
bind.bind(Player.class).annotatedWith(Names.named(“Bad”)).to(BadPlayer.class);
@命名为(“Good”)的Player goodPlayer=(Player)injector.getInstance(Player.class);
@命名为(“坏”)的Player badPlayer=(Player)injector.getInstance(Player.class);
但是我正在使用的应用程序是这样的。我们正在使用init()方法绑定所有模块并创建喷油器模块:

//要绑定的单独方法
受保护的void configure(){
绑定(新的TypeLiteral(){}).toInstance(serviceSets);
}
//分注法
喷油器i=Guice.createInjector(模块);
但是通过上面的过程,我可以将一个实现类绑定到接口(服务类)

你能给我提供一个与供应商合作的方法吗。我想在下面做一些类似的事情

类TestServiceProvider扩展了提供程序{
//返回所需的impl类实例的一些代码。在我的示例中,TestServiceImplOne和TestServiceImplTwo和provider返回服务类的相应实例
}
并将服务类与提供程序类绑定。像这样的

bind(TestService.class).toProvider(TestServiceProvider.class);
如果有人建议一个使用提供者的好例子,或者我可以在客户机中注入任何我想要的实现的其他方式,我将不胜感激

注意:我使用的是webservices,我不确定当webservice被调用到服务类时如何注入不同的实现


//获取URI 得到{ou}


正如Vladimir所指出的,您可以对提供者使用绑定注释

// in YourModule.configure():
bind(TestService.class)
    .annotatedWith(Names.named("foo")
    .toProvider(TestServiceProvider.class);
…和使用TypeLiterals的泛型类型

bind(new TypeLiteral<List<Service>>() {})
    .annotatedWith(Names.named("bar")
    .toInstance(serviceSets);

正如Vladimir所指出的,您可以对提供者使用绑定注释

// in YourModule.configure():
bind(TestService.class)
    .annotatedWith(Names.named("foo")
    .toProvider(TestServiceProvider.class);
…和使用TypeLiterals的泛型类型

bind(new TypeLiteral<List<Service>>() {})
    .annotatedWith(Names.named("bar")
    .toInstance(serviceSets);

不清楚为什么不能使用绑定注释。请详述那一部分。顺便说一句,你的例子是错误的。注释局部变量并使用
Injector.getInstance()
调用为其赋值将不起任何作用。你必须使用
Key
class来实现这一点。为什么不能使用绑定注释,这一点绝对不清楚。请详述那一部分。顺便说一句,你的例子是错误的。注释局部变量并使用
Injector.getInstance()
调用为其赋值将不起任何作用。您必须使用
类。在上一个示例中,您如何访问“设置”?在上一个示例中,您如何访问“设置”?
List<Service> servicesOne = injector.getInstance(
    new Key<List<Service>>(Names.named("bar")) {});
// or
List<Service> servicesTwo = injector.getInstance(
    Key.get(new TypeLiteral<List<Service>>() {}, Names.named("bar"));
class MyInjectorCreator {
  @Inject @Named("foo") Provider<TestService> fooServiceProvider;
  @Inject @Named("bar") List<Service> barServices;
  // Guice will also wrap/unwrap Providers automatically.
  @Inject @Named("foo") TestService fooService;
  @Inject @Named("bar") Provider<List<Service>> barServicesProvider;

  public void createInjector() {
    Injector injector = Guice.createInjector(getListOfModules());
    injector.injectMembers(this);
  }
}
class TestServiceProvider extends Provider<TestService> {
  // Injection is allowed here!
  @Inject ApplicationSettings settings;
  @Inject Provider<TestServiceImplOne> oneProvider;
  @Inject Provider<TestServiceImplTwo> twoProvider;

  @Override public TestService get() {
    if (settings.isInTestMode()) {
      return new TestTestServiceImplImpl(); // without injection!
    } else if (settings.useNewService()) {
      return twoProvider.get(); // with injection!
    } else {
      return oneProvider.get(); // also with injection!
    }
  }
}
// in YourModule.configure():
if (settings.isInTestMode()) {
  bind(TestService.class).toInstance(new TestTestServiceImplImpl());
} else if (settings.useNewService()) {
  bind(TestService.class).to(TestServiceImplTwo.class);
} else {
  bind(TestService.class).to(TestServiceImplOne.class);
}