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