Перейти к основному содержанию

Инъекционные экземпляры

В этом учебнике мы будем внедрять экземпляры в классы. Мы будем использовать 2 подхода:

  • Использование InstanceInjector
  • Добавление класса, поля которого будут инжектироваться в граф привязок

Модули#

Мы определим два независимых модуля: один будет предоставлять String сообщение, другой - int id.

public class MessageModule extends AbstractModule {    @Provides    String message() {        return "hello";    }}
public class IdModule extends AbstractModule {    @Provides    int id() {        return 123;    }}

Использование InstanceInjector#

Вот класс, поля которого должны быть инжектированы.

public class Injected {    @Inject    String value;
    @Inject    int id;}

Нам нужно создать инжектор `и передать ему в качестве параметровMessageModuleиIdModule` .

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

Injector injector = Injector.of(        new MessageModule(),        new IdModule(),        ModuleBuilder.create()                .bindInstanceInjector(Injected.class)                .build());

Наконец, нам нужно получить InstanceInjector из Injector и использовать его для инъекции полей во вновь созданный Injected экземпляр.

InstanceInjector<Injected> instanceInjector = injector.getInstanceInjector(Injected.class);
Injected injected = new Injected();instanceInjector.injectInto(injected);

Добавление класса в граф привязок#

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

@Injectpublic class Injected {    @Inject    String value;
    @Inject    int id;}

В качестве альтернативы вы можете добавить конструктор и аннотировать его аннотацией @Inject следующим образом:

public class Injected {    private final String value;    private final int id;
    @Inject    public Injected(String value, int id) {        this.value = value;        this.id = id;    }    //...}

Нам по-прежнему необходимо создать инжектор `и передать ему в качестве параметровMessageModuleиIdModule` .

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

Injector injector = Injector.of(        new MessageModule(),        new IdModule(),        ModuleBuilder.create()                .bind(Injected.class)                .build());

Наконец, мы можем запросить у инжектора экземпляр Injected . Все поля введены правильно.

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