Как внедрить коллекцию у провайдера - PullRequest
1 голос
/ 04 июля 2019

В моем приложении есть класс Gateway и файл json с набором этих шлюзов. Я уже проанализировал этот JSON, давая мне объект Set. Теперь я хочу создать Multibinder для внедрения этого набора в мой код. Пока я создал этого провайдера:

public class GatewaysProvider implements Provider<Set<Gateway>> {

@Override
public Set<Gateway> get() {
    try {
        File file = new File(getClass().getResource("/gateways.json").toURI());
        Type listType = new TypeToken<Set<Gateway>>(){}.getType();
        return new Gson().fromJson(new FileReader(file), listType);
    } catch (URISyntaxException | FileNotFoundException e) {
        e.printStackTrace();
    }

    return new HashSet<>();

}

}

Что мне еще нужно сделать, чтобы иметь возможность вставлять этот набор в любое место моего кода, например:

Set<Gateways> gateways;

@Inject
public AppRunner(Set<Gateway> gateways) {
    this.gateways = gateways;
}

1 Ответ

1 голос
/ 04 июля 2019

Что вам нужно, так это реализация механизма внедрения зависимостей .

Вы можете сделать это самостоятельно, но я бы посоветовал вам использовать существующую библиотеку DI, например EasyDI

Пожалуйста, продолжайте, следуя инструкциям ниже:

  1. Добавьте EasyDI к вашему пути к классам. С Maven это будет:

    <dependency>
        <groupId>eu.lestard</groupId>
        <artifactId>easy-di</artifactId>
        <version>0.3.0</version>
    </dependency>
    
  2. Добавьте тип оболочки для вашего Шлюза и настройте Поставщик соответственно:

    public class GatewayContainer {
      Set<Gateway> gateways;
    
      public void setGateways(Set<Gateway> gateways) {
        this.gateways = gateways;
      }
    }
    
    public class GatewayProvider implements Provider<GatewayContainer> {
    
      @Override
      public GatewayContainer get() {
          try {
              File file = new File(getClass().getResource("/gateways.json").toURI());
              Type listType = new TypeToken<Set<Gateway>>() {
              }.getType();
              Set<Gateway> set = new Gson().fromJson(new FileReader(file), listType);
              GatewayContainer container = new GatewayContainer();
              container.setGateways(set);
              return container;
          } catch (URISyntaxException | FileNotFoundException e) {
              e.printStackTrace();
          }
          return new GatewayContainer();
      }
    }
    
  3. Настройка и использование вашего контекста:

    public class AppRunner {
      GatewayContainer container;
    
      public AppRunner(GatewayContainer container) {
          this.container = container;
      }
    
      public static void main(String[] args) {
          EasyDI context = new EasyDI();
          context.bindProvider(GatewayContainer.class, new GatewayProvider());
          final AppRunner runner = context.getInstance(AppRunner.class);
      }
    }
    

После этого вы получите AppRunner со всеми введенными зависимостями.

Примечание: Нет использования каких-либо @Inject (или подобных) аннотаций, потому что EasyDI не требует его по умолчанию

...