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

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 参数的情况下初始化它们?

Jef*_*ica 5

提供者可以接受@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 注释。但是,如果您必须根据变量中的名称或类文字实例化任意类,那么注入注入器就是正确的方法。