如何使用提供者注入集合
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
请按照以下步骤继续:
将 EasyDI 添加到您的类路径中。使用 Maven 它将是:
<dependency>
<groupId>eu.lestard</groupId>
<artifactId>easy-di</artifactId>
<version>0.3.0</version>
</dependency>
为您的 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();
}
}
配置和使用您的上下文:
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 不需要它
我的应用程序有一个名为 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
请按照以下步骤继续:
将 EasyDI 添加到您的类路径中。使用 Maven 它将是:
<dependency> <groupId>eu.lestard</groupId> <artifactId>easy-di</artifactId> <version>0.3.0</version> </dependency>
为您的 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(); } }
配置和使用您的上下文:
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 不需要它