如何向提供者注入集合

时间:2019-07-04 18:19:03

标签: java guice

我的应用程序有一个名为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 个答案:

答案 0 :(得分:1)

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

您可以自己做,但是我建议您使用现有的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 以及所有注入的依赖项。

注意:因为EasyDI默认不需要它,所以没有使用任何类型的@Inject(或类似的注释)