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

时间:2016-04-06 13:34:23

标签: java dependency-injection 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的参数的情况下启动它们?

1 个答案:

答案 0 :(得分:3)

提供者可以接受@Inject - 带注释的构造函数和字段,而Guice的内置绑定将允许您为注入器可以提供的任何键注入Injector和Provider(例如{ {1}})。

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(""))); } } 注释在类上,而不是方法;根据Guice邮件列表&#34;范围注释作为一个整体适用于提供者,使用@Singleton注释get()方法是错误的并被忽略。&#34; (link)。

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