Guice - Как получить экземпляр, когда все, что вы знаете, это интерфейс - PullRequest
1 голос
/ 04 июня 2011

Во всех примерах Guice, которые я нашел, получение экземпляра включает вызов Injector.getInstance() с конкретным классом в качестве параметра. Есть ли способ получить экземпляр от Guice, используя только интерфейс?

public interface Interface {}
public class Concrete implements Interface {}

Interface instance = injector.getInstance(Interface.class);

Спасибо

Ответы [ 3 ]

8 голосов
/ 04 июня 2011

На самом деле это именно то, для чего создан Guice.

Чтобы заставить getInstance () работать с интерфейсом, вам нужно сначала связать реализацию этого интерфейса в вашем модуле.

Итак, вам понадобится класс, который выглядит примерно так:

public class MyGuiceModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(Interface.class).to(Concrete.class);
    }
}

Затем, когда вы создаете свой инжектор, вам просто нужно передать экземпляр вашего модуля в:

Injector injector = Guice.createInjector(new MyGuiceModule());

Теперь ваш вызов injector.getInstance(Interface.class) должен вернуть новый экземпляр Concrete с использованием конструктора по умолчанию.

Конечно, есть еще много способов связывания, но это, вероятно, самый прямой путь.

0 голосов
/ 06 июня 2011

Не используя Module, вы также можете указать класс реализации, который будет использоваться по умолчанию, непосредственно в объявлении интерфейса:

@ImplementedBy(Concrete.class)
public interface Interface {}

Это не обязательно подходит для любой ситуации, но я нашел этоВ большинстве случаев это очень удобно.

Кроме того, при использовании аннотации @ImplementedBy вы все равно можете переопределить класс реализации, связав другой конкретный класс в Module.Это также может быть полезно.

0 голосов
/ 04 июня 2011

Это работает и для интерфейса:

bind( Interface.class ).to( Concrete.class );
...