Java 如何在guice提供程序中使用guice注入器?

Java 如何在guice提供程序中使用guice注入器?,java,dependency-injection,guice,provider,Java,Dependency Injection,Guice,Provider,我正在使用guice注入依赖项 我有一个供应商: public class RequestUrlRepository implements Provider<IRequestUrlRepository> { @Singleton @Override public IRequestUrlRepository get() { IRequestUrlRepository answer = null; if (System.getP

我正在使用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;
    }
}
公共类RequestUrlRepository实现提供程序{
@独生子女
@凌驾
公共IRequestUrlRepository get(){
IRequestUrlRepository回答=null;
if(System.getProperty(“”).equals(RouteOrCostRequest.cost.toString()){
答案=新的CostRequestUrlRepository(…);
}
其他的
{
答案=新路由请求URL存储库(…);
}
返回答案;
}
}
如何使用guice injector填充
新CostRequestUrlRepository(…)
新RoutingRequestUrlRepository(…)
在提供程序中时


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

提供程序可以接受
@Inject
-带注释的构造函数和字段,Guice的内置绑定将允许您为注入器可以提供的任何键注入
注入器
和提供程序(例如
提供程序

@Singleton
公共类RequestUrlRepository实现了提供者{
@注入提供者costRepositoryProvider;
@注入提供程序routingRepositoryProvider;
@注入器;
@重写公共IRequestUrlRepository get(){
IRequestUrlRepository回答=null;
if(System.getProperty(“”).equals(RouteOrCostRequest.cost.toString()){
返回costRepositoryProvider.get();
}否则{
返回routingRepositoryProvider.get();
}
//或者:
返回injector.getInstance(Class.forName(System.getProperty(“”));
}
}
注意,
@Singleton
注释在类上,而不是在方法上;根据Guice邮件列表,“范围注释作为一个整体应用于提供程序,用@Singleton注释get()方法是错误的,并且被忽略。”()


理想情况下,您应该注入每个提供者,而不是注入整个注入器;这将使您更容易查看系统的依赖关系,然后您将更少地依赖于Guice,而更多地依赖于一般的JSR330注释。但是,如果必须基于变量中的名称或类文字实例化任意类,则注入注入器是一种方法。

I引导init
costRepository
routingRepository
填充接口
IRequestUrlRepository
。我认为我不应该为它们中的每一个编写provider,因为任何绑定到
X
provider
,或
@提供X
,Guice将自动创建一个provider或调用
provider.get()
。没有必要为存储库编写自己的提供者。
@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("")));
    }
}