Я хотел бы дополнить ответ Марцина, добавив, что вам не нужно ограничивать себя использованием toInstance()
или методов провайдера в такой ситуации.
Следующее будет работать так же хорошо:
bind(Person.class).annotatedWith(Driver.class).to(MartyMcFly.class).in(Singleton.class);
bind(Person.class).annotatedWith(Inventor.class).to(DocBrown.class).in(Singleton.class);
[...]
@Inject
public BackToTheFuture(@Driver Person marty, @Inventor Person doc) { ... }
Guice будет вводить зависимости как обычно при создании экземпляров классов MartyMcFly и DocBrown.
Обратите внимание, что это также работает, когда вы хотите связать несколько синглетов одного типа :
bind(Person.class).annotatedWith(Driver.class).to(Person.class).in(Singleton.class);
bind(Person.class).annotatedWith(Inventor.class).to(Person.class).in(Singleton.class);
Чтобы это работало, вы должны убедиться, что Person
не связан в области действия Singleton, явно в модуле Guice или с аннотацией @Singleton
. Подробнее в этом Гисте .
Edit:
Пример кода, который я привожу в качестве примера, взят из Guice Grapher Test .
Просмотр тестов Guice - отличный способ лучше понять, как использовать API (что также относится к каждому проекту с хорошими модульными тестами).