شما می تونید از انوتیشن @Named استفاده کنید:
@Inject
@Named("yourService")
private Service service;
اما دقت داشته باشید که استفاده از String بدلیل نداشتن قابلیت static check می تونه مشکل زا بشه و best practice نیست و Guice یک راه جایگزین بهتر نیز دارد که Binding Annotations نام دارد، که در آن شما بجای استفاده از String نوع انوتیشن تعریف می کنید. به مثال زیر توجه کنید:
@BindingAnnotation
@Target( { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Better {}
public class GuiceMain {
@Inject
private Car car;
public static void main(String[] args) {
Injector injector = Guice.createInjector(new MyModule());
GuiceMain main = injector.getInstance(GuiceMain.class);
}
}
public class MyModule extends AbstractModule {
public void configure() {
bind(Engine.class).annotatedWith(Better.class).to(BetterEngine.class);
}
}
public class Car {
@Inject
public Car(@Better Engine engine) { ... }
}
public class BetterEngine extends Engine {
@Inject
public BetterEngine(Piston piston) {
super(piston);
}
}
البته هم @Named و هم تعریف Binding Annotations هر دو برای مورد شما جواب می دهد.