gpt4 book ai didi

java - 如何在 guice 提供程序中使用 guice 注入(inject)器?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:04 25 4
gpt4 key购买 nike

我正在使用 guice 来注入(inject)依赖项。

我有这个供应商:

public class RequestUrlRepository implements Provider<IRequestUrlRepository> {


@Singleton
@Override
public IRequestUrlRepository get() {
IRequestUrlRepository answer = null;
if (System.getProperty("").equals(RouteOrCostRequest.cost.toString())){
answer = new CostRequestUrlRepository(...);
}
else
{
answer = new RoutingRequestUrlRepository(...);
}
return answer;
}
}

我如何使用 guice 注入(inject)器来填充 new CostRequestUrlRepository(...);new RoutingRequestUrlRepository(...) 当它在提供者中时?

如果不可能,我如何在不手动创建所有 ctor 参数的情况下初始化它们?

最佳答案

供应商可以接受@Inject -带注释的构造函数和字段,以及 Guice 的内置绑定(bind)将让您同时注入(inject) Injector以及注入(inject)器可以提供的任何 key 的提供者(例如 Provider<CostRequestUrlRepository> )。

@Singleton
public class RequestUrlRepository implements Provider<IRequestUrlRepository> {

@Inject Provider<CostRequestUrlRepository> costRepositoryProvider;
@Inject Provider<RoutingRequestUrlRepository> routingRepositoryProvider;
@Inject Injector injector;

@Override public IRequestUrlRepository get() {
IRequestUrlRepository answer = null;
if (System.getProperty("").equals(RouteOrCostRequest.cost.toString())){
return costRepositoryProvider.get();
} else {
return routingRepositoryProvider.get();
}

// Alternatively:
return injector.getInstance(Class.forName(System.getProperty("")));
}
}

请注意 @Singleton注释在类上,而不是方法上;根据 Guice 邮件列表“范围注释适用于整个提供程序,使用 @Singleton 注释 get() 方法是错误的并被忽略。” (link)。

理想情况下,您应该注入(inject)每个提供者,而不是注入(inject)整个注入(inject)器;这应该可以更轻松地查看系统的依赖项,然后您将减少对 Guice 的依赖,更多地依赖一般的 JSR330 注释。但是,如果您必须根据变量中的名称或类字面量实例化任意类,那么注入(inject) Injector 是可行的方法。

关于java - 如何在 guice 提供程序中使用 guice 注入(inject)器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36452757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com