作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 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/
我是一名优秀的程序员,十分优秀!