如何使用提供者注入集合

How to inject a collection with provider

我的应用程序有一个名为 Gateway 的 class 和一个包含一组这些网关的 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;
}

你需要的是实现依赖注入机制。

你可以自己做,但我建议你使用现有的 DI 库,比如 EasyDI

请按照以下步骤继续:

  1. EasyDI 添加到您的类路径中。使用 Maven 它将是:

    <dependency>
        <groupId>eu.lestard</groupId>
        <artifactId>easy-di</artifactId>
        <version>0.3.0</version>
    </dependency>
    
  2. 为您的 Gateway 设置添加包装器类型,并相应地调整 Provider

    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 不需要它