Подтвердить что ты не робот

Получение нескольких однотипных однотипных ячеек

можете ли вы получить 2 экземпляра одного типа одного и того же базового типа?

это, очевидно, тривиально в spring, поскольку оно основано на именованных экземплярах, к которым вы присоединяете область видимости, но я не вижу эквивалента в виде, относящегося к типам привязки к классам реализации. Обратите внимание, что я не хочу привязываться к экземпляру, поскольку соответствующие экземпляры вводятся с помощью других зависимостей.

4b9b3361

Ответ 1

Легко и в Guice! Создайте две аннотации biding, скажем @One и @Two, а затем

bind(MySingleton.class).annotatedWith(One.class).toInstance(new MySingleton());
bind(MySingleton.class).annotatedWith(Two.class).toInstance(new MySingleton());

а затем

@Inject
public SomethingThatDependsOnSingletons(@One MySingleton s1,
    @Two MySingleton t2) { ... }

Ответ 2

Я хотел бы дополнить ответ Marcin, добавив, что вам не нужно ограничивать себя использованием методов 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. Подробнее в этот Gist.

Изменить: Пример кода, который я приводил в качестве примера, приведен из теста Guice Grapher. Глядя на тесты Guice - отличный способ лучше понять, как использовать API (что также относится к каждому проекту с хорошими модульными тестами).