如何从@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()
}
}
执行测试的步骤:
CURRENT_PRODUCT = 'Product1'
operate()
给我们 prodcut1 的实例,例如 Product1ProcessBuilder@26aecf31
CURRENT_PRODUCT = 'Product2'
operate()
给我们 prodcut2 的实例,例如 Product2ProcessBuilder@4bb4adf7
CURRENT_PRODUCT = 'Product1'
operate()
给我们 prodcut1 的实例,例如 Product1ProcessBuilder@11544ddd
CURRENT_PRODUCT = 'Product2'
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) 中获得相同的实例
我有带 @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()
}
}
执行测试的步骤:
CURRENT_PRODUCT = 'Product1'
operate()
给我们 prodcut1 的实例,例如Product1ProcessBuilder@26aecf31
CURRENT_PRODUCT = 'Product2'
operate()
给我们 prodcut2 的实例,例如Product2ProcessBuilder@4bb4adf7
CURRENT_PRODUCT = 'Product1'
operate()
给我们 prodcut1 的实例,例如Product1ProcessBuilder@11544ddd
CURRENT_PRODUCT = 'Product2'
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) 中获得相同的实例