【问题标题】:how to use guice injector in a guice provider?如何在 guice 提供程序中使用 guice 注入器?
【发布时间】:2016-07-26 22:51:09
【问题描述】:

我正在使用 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;
    }
}

new CostRequestUrlRepository(...);new RoutingRequestUrlRepository(...) 在提供程序中时,如何使用 guice 注入器填充它?

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

【问题讨论】:

    标签: java dependency-injection guice provider


    【解决方案1】:

    Providers 可以接受 @Inject-annotated 构造函数和字段,Guice 的内置绑定将允许您为注入器可以提供的任何键注入 Injector 和 Provider(例如 Provider&lt;CostRequestUrlRepository&gt;)。

    @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)。

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

    【讨论】:

    • 我建议初始化costRepositoryroutingRepository 来填充接口IRequestUrlRepository。我不认为我应该给他们每个人写提供者
    • 对于任何与XProvider&lt;X&gt;@Provides X 的绑定,Guice 将自动创建一个Provider 或自动调用provider.get()。无需为存储库编写自己的提供程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    相关资源
    最近更新 更多