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

Сканирование класса

В этом учебнике мы определим @Provides методы в произвольных классах, которые не реализуют Модуль интерфейс. Затем мы просканируем эти классы, чтобы собрать провайдеров для Injector.

Классы с @Provides методы#

Мы определим два класса, которые содержат методы, аннотированные аннотацией @Provides . Первый класс StaticProviders будет содержать только статические @Provides-методы. Другой класс MixedProviders содержит как статические, так и экземпляры @Provides-методов.

public static class StaticProviders {  @Provides  static int port() {    return 1234;  }
  @Provides  static String databaseName() {    return "exampleDB";  }}

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

public static class MixedProviders {  private final String hostname;
  public MixedProviders(String hostname) {    this.hostname = hostname;  }
  @Provides  InetSocketAddress address(int port) {    return new InetSocketAddress(hostname, port);  }
  @Provides  static DataSource dataSource(InetSocketAddress address, String dbName) {    return new DataSource(address, dbName);  }}

MixedProviders класс предоставляет адрес к базе данных и DataSource класс. DataSource класс требует имени базы данных, а также адреса к базе данных. Класс выглядит следующим образом:

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";  }}

Создание инжектора ``#

Для создания инжектора нам нужно предоставить некоторые DI модули. Но у нас есть только произвольные классы с @Provides-методами. Мы можем использовать ModuleBuilder класс для создания модуля на основе этих произвольных классов. ModuleBuilder имеет несколько методов scan() , которые можно использовать для сканирования класса или экземпляра и сбора провайдеров. Сканируется вся иерархия классов, поэтому провайдеры, определенные в суперклассах , также будут подхвачены scan(). Вот как мы создаем инжектор ``:

public static void main(String[] args) {  Injector injector = Injector.of(      ModuleBuilder.create()          .scan(StaticProviders.class)          .scan(new MixedProviders("example.com"))          .build()  );
  DataSource dataSource = injector.getInstance(DataSource.class);  System.out.println(dataSource.queryData());}

Для класса StaticProviders , который содержит только статические провайдеры, нам не нужен экземпляр класса. Поэтому мы передаем класс только в метод scan() . В качестве альтернативы, класс MixedProviders также содержит нестатический метод провайдера, поэтому нам нужно передать экземпляр MixedProviders в метод scan() .

Все собранные провайдеры формируют новый модуль `, который затем передается вInjcetor`.

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