我正在使用guice来注入依赖项。
我有这个提供者:
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注入器填充new CostRequestUrlRepository(...);
和new RoutingRequestUrlRepository(...)
?
如果不可能,如何在不手动创建所有ctor的参数的情况下启动它们?
答案 0 :(得分:3)
提供者可以接受@Inject
- 带注释的构造函数和字段,而Guice的内置绑定将允许您为注入器可以提供的任何键注入Injector
和Provider(例如{ {1}})。
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("")));
}
}
注释在类上,而不是方法;根据Guice邮件列表&#34;范围注释作为一个整体适用于提供者,使用@Singleton注释get()方法是错误的并被忽略。&#34; (link)。
理想情况下,您应该注入每个提供者,而不是注入整个注射器;这样可以更容易地查看系统的依赖关系,然后您更少依赖Guice,而更多地依赖于一般的JSR330注释。但是,如果必须基于变量中的名称或类文字实例化任意类,那么注入Injector是可行的方法。