有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在guice提供程序中使用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;
    }
}

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

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


共 (1) 个答案

  1. # 1 楼答案

    提供程序可以接受@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("")));
        }
    }
    

    注意@Singleton注释在类上,而不是在方法上;根据Guice邮件列表,“范围注释作为一个整体应用于提供程序,用@Singleton注释get()方法是错误的,并且被忽略。”(link

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