我的应用程序有一个名为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;
}
答案 0 :(得分:1)
您需要的是依赖注入机制的实现。
您可以自己做,但是我建议您使用现有的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 以及所有注入的依赖项。
注意:因为EasyDI默认不需要它,所以没有使用任何类型的@Inject
(或类似的注释)