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

Быстрый старт

В этом уроке мы создадим Инжектор из нескольких модулей DI. Затем мы воспользуемся инжектором `` для создания экземпляра некоторого сервиса. Мы будем использовать подход на основе аннотаций для определения модулей, так как он более читабелен.

Классы-помощники#

Для этого урока нам понадобятся 2 класса-помощника. Класс DataSource , который представляет источник некоторых данных, и класс Service , который использует данные, полученные из источника данных, для некоторой обработки.

public static final class DataSource {  private final InetSocketAddress address;  private final String dbName;
  @Inject  public DataSource(InetSocketAddress address, String dbName) {    this.address = address;    this.dbName = dbName;  }
  public String queryData() {    System.out.printf("Querying %s:%s for data\n", address, dbName);    return "data";  }}
public static final class Service {  private final DataSource dataSource;
  public Service(DataSource dataSource) {    this.dataSource = dataSource;  }
  public void process() {    String data = dataSource.queryData();    System.out.printf("Processing data: '%s'\n", data);  }}
note

Обратите внимание на аннотацию @Inject на конструкторе DataSource . Это будет объяснено позже.

Модули#

Мы определим два разных модуля: один для конфигурации, а другой для самой службы.

public static class ConfigModule extends AbstractModule {  @Provides  InetSocketAddress inetSocketAddress() {    return new InetSocketAddress(1234);  }
  @Provides  String dbName() {    return "exampleDB";  }}

ConfigModule предоставляет как адрес для DataSource , так и имя базы данных.

public static class ServiceModule extends AbstractModule {  @Provides  Service service(DataSource dataSource) {    return new Service(dataSource);  }}

ServiceModule предоставляет только сам Service , который требует DataSource для инстанцирования.

Инжектор#

Инжектор создан из двух ранее определенных модулей. После этого от инжектора требуется экземпляр Service .

public static void main(String[] args) {  Injector injector = Injector.of(new ConfigModule(), new ServiceModule());  Service service = injector.getInstance(Service.class);  service.process();}

Сервис требует инстанцирования DataSource , но мы не предусмотрели DataSource в явном виде ни в одном из модулей. Благодаря аннотации @Inject на DataSource'конструкторе, инжектор инжектировал необходимые зависимости и инстанцировал DataSource. Результат вызова service.process() следующий:

Запрос 0.0.0.0/0.0.0.0:1234:exampleDB для получения данныхОбработка данных: 'data'

Примеры источников можно найти на Github