如何在 guice 提供程序中使用 guice 注入器?
how to use guice injector in a guice provider?
我正在使用 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 参数的情况下初始化它们?
Providers 可以接受 @Inject
-注解的构造函数和字段,Guice 的内置绑定将允许您为注入器可以提供的任何键注入 Injector
和 Provider(例如 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
注释出现在 class 上,而不是方法;根据 Guice 邮件列表 "Scope annotations apply to providers as a whole, annotating the get() method with @Singleton is erroneous and ignored." (link).
理想情况下,您应该注入每个提供者,而不是注入整个注入器;这应该可以更轻松地查看系统的依赖项,然后您将减少对 Guice 的依赖,更多地依赖一般的 JSR330 注释。但是,如果您必须根据名称或变量中的 Class 文字实例化任意 class,那么注入 Injector 是可行的方法。
我正在使用 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 参数的情况下初始化它们?
Providers 可以接受 @Inject
-注解的构造函数和字段,Guice 的内置绑定将允许您为注入器可以提供的任何键注入 Injector
和 Provider(例如 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
注释出现在 class 上,而不是方法;根据 Guice 邮件列表 "Scope annotations apply to providers as a whole, annotating the get() method with @Singleton is erroneous and ignored." (link).
理想情况下,您应该注入每个提供者,而不是注入整个注入器;这应该可以更轻松地查看系统的依赖项,然后您将减少对 Guice 的依赖,更多地依赖一般的 JSR330 注释。但是,如果您必须根据名称或变量中的 Class 文字实例化任意 class,那么注入 Injector 是可行的方法。