gpt4 book ai didi

java - Guice FactoryModuleBuilder 一个带有构造函数参数的实例

转载 作者:行者123 更新时间:2023-12-02 03:45:57 24 4
gpt4 key购买 nike

我正在使用 Guice 使用配置文件中的一些参数来初始化一个类

@Provides
@Singleton
RetryServiceCaller provideMaxRetryAttempts(@Named("config") JsonObject config) throws IOException {
JsonObject retryDetails = config.getJsonObject("retry_details");
return new RetryServiceCaller(retryDetails.getInteger("maxRetryAttempts"), retryDetails.getInteger("upperBoundary"), retryDetails.getInteger("lowerBoundary"),
retryDetails.getLong("multiplicationFactor"), retryDetails.getInteger("timeout"), retryDetails.getInteger("increaseTimeout"));
}

这个类被注入(inject)到另一个也是单例的类中。

class A{
@Inject private RetryServiceCaller retryServiceCaller;
}

但现在的问题是,由于这个新的类 A 是单例的,所以每次有人使用这个类 A 时,我都需要克隆 retryServiceCaller。

我一直在研究 FactoryModuleBuilder 以使用它并为此类创建一个工厂。但由于该类具有来自配置文件的参数,我找不到使其工作的方法。

类似这样的事情

  class A{
@Inject private RetryServiceCaller.Factory retryServiceCallerFactory;

}

然后在我的 RetryServiceCaller 中实现这个

public interface Factory {
@Inject
RetryServiceCaller create();
}


@Inject
public RetryServiceCaller(int maxRetryAttempts, int upperBoundary, int lowerBoundary, long multiplicationFactor, int timeout, int incrementTimeout) {
this.maxRetryAttempts = maxRetryAttempts;
this.upperBoundary = upperBoundary;
this.lowerBoundary = lowerBoundary;
this.multiplicationFactor = multiplicationFactor;
this.timeout = timeout;
this.incrementTimeout = incrementTimeout;
}

但是 guice 给我错误说

No implementation for com.proxy.handlers.RetryServiceCaller$Factory was bound

最佳答案

Guice 可以自动提供零参数工厂:而不是注入(inject) Foo ,你可以随时注入(inject)Provider<Foo> 。这允许您调用 fooProvider.get()随时随地创建实例。您不必绑定(bind)到 Provider或使用 Provides访问它的方法;你可以注入(inject)FooProvider<Foo>您是否使用 bind(...).to(...)类型绑定(bind),a toProvider绑定(bind),a toInstance绑定(bind),a @Provides方法,或其他任何东西,Guice 会调用 get或返回内部 Provider自动。

(返回的 Provider 也将遵循范围,因此您需要删除 @Singleton 范围才能获取多个实例,并且请注意 toInstance 绑定(bind)将始终返回相同的实例。)

这不是 FactoryModuleBuilder 的工作;仅当您需要在同一类型中混合注入(inject)和非注入(inject)构造函数参数时才使用 FactoryModuleBuilder。

完成的绑定(bind)应如下所示:

@Provides
/* NOT @Singleton */
RetryServiceCaller provideMaxRetryAttempts(@Named("config") JsonObject config) throws IOException {
JsonObject retryDetails = config.getJsonObject("retry_details");
return new RetryServiceCaller(retryDetails.getInteger("maxRetryAttempts"), retryDetails.getInteger("upperBoundary"), retryDetails.getInteger("lowerBoundary"),
retryDetails.getLong("multiplicationFactor"), retryDetails.getInteger("timeout"), retryDetails.getInteger("increaseTimeout"));
}

在你的类里面:

@Inject public YourCallerConsumer(Provider<RetryServiceCaller> callerProvider) {
this.callerProvider = callerProvider;
}

public void doAction() {
RetryServiceCaller newCaller = callerProvider.get();
// interact with caller
}

关于java - Guice FactoryModuleBuilder 一个带有构造函数参数的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36290073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com