Ela*_*da2 5 java provider dependency-injection guice
我正在使用 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;
}
}
Run Code Online (Sandbox Code Playgroud)
我如何使用 guice 注射器进行填充new CostRequestUrlRepository(...); 以及new RoutingRequestUrlRepository(...)它何时位于提供程序中?
如果不可能,我如何在不手动创建所有 ctor 参数的情况下初始化它们?
提供者可以接受@Inject带注释的构造函数和字段,Guice 的内置绑定将允许您注入两者Injector以及注入器可以提供的任何键的提供者(例如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("")));
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,@Singleton注释是在类上,而不是在方法上;根据 Guice 邮件列表“范围注释适用于整个提供者,使用 @Singleton 注释 get() 方法是错误的并被忽略。” (关联)。
理想情况下,您应该注入每个提供程序,而不是注入整个注入器;这应该可以让您更容易地看到系统的依赖关系,然后您就可以减少对 Guice 的依赖,而更多地依赖通用的 JSR330 注释。但是,如果您必须根据变量中的名称或类文字实例化任意类,那么注入注入器就是正确的方法。