如何从@Provides 方法获取单例?

How can I get Singletons from @Provides method?

我有带 @Provides 方法的模块:

class EnvironmentModule extends AbstractModule {

    static String CURRENT_PRODUCT

    @Override
    protected final void configure() {
    }

        @Provides
    static ProcessBuilder get(){
        return CURRENT_PRODUCT == 'Product1' ? new Product1ProcessBuilder() : new Product2ProcessBuilder()
    }

Class 我在其中注入 ProcessBuilder:

class Operation {

    @Inject
    Provider<ProcessBuilder> processBuilder

    void operate() {
        def process = processBuilder.get().build()
    }
}

执行测试的步骤:

  1. CURRENT_PRODUCT = 'Product1'
  2. operate() 给我们 prodcut1 的实例,例如 Product1ProcessBuilder@26aecf31
  3. CURRENT_PRODUCT = 'Product2'
  4. operate() 给我们 prodcut2 的实例,例如 Product2ProcessBuilder@4bb4adf7
  5. CURRENT_PRODUCT = 'Product1'
  6. operate() 给我们 prodcut1 的实例,例如 Product1ProcessBuilder@11544ddd
  7. CURRENT_PRODUCT = 'Product2'
  8. operate() 给我们 prodcut2 的实例,例如 Product2ProcessBuilder@38e46ea

如何在步骤 2)、6) 和 4)、8) 中获取相同的实例?

当我用 @Singleton 注释 @Provides 方法时,它总是 returns 第一个返回产品的相同实例。 当我用 @Singleton 注释每个 class 产品 class 时,我每次都有另一个产品。

您只需多一点配置就可以做您想做的事:

@Provides @Singleton @Named("Product1")
static ProcessBuilder provideProduct1ProcessBuilder() {
  return new Product1ProcessBuilder();
}

@Provides @Singleton @Named("Product2")
static ProcessBuilder provideProduct2ProcessBuilder() {
  return new Product2ProcessBuilder();
}

static String CURRENT_PRODUCT;

@Provides static ProcessBuilder get(
    @Named("Product1") ProcessBuilder product1ProcessBuilder,
    @Named("Product2") ProcessBuilder product2ProcessBuilder) {
  // Note the absence of @Singleton
  return "Product1".equals(CURRENT_PRODUCT) ? product1ProcessBuilder : product2ProcessBuilder;
}

在 EnvironmentModule class 中,您的 get() 方法应该是:

 @Provides
    static ProcessBuilder get(Product1ProcessBuilder product1CommonBorrowOperations, Product2ProcessBuilder product2CommonBorrowOperations) {
        return CURRENT_PRODUCT == 'Product1' ? product1CommonBorrowOperations : product2CommonBorrowOperations
    }

您的 classes Product1ProcessBuilder 和 Product2ProcessBuilder 也应该使用 @Singleton 进行注释,以便在步骤 2)、6) 和 4)、8) 中获得相同的实例