[英]How to use Google Guice to create objects that require parameters?
也許我只是盲目,但我不知道如何使用Guice(剛開始)來替換此方法中的new
調用:
public boolean myMethod(String anInputValue) {
Processor proc = new ProcessorImpl(anInputValue);
return proc.isEnabled();
}
對於測試,可能有一個不同的處理器實現,所以我想避免new
調用,並在此過程中擺脫對實現的依賴。
如果我的類只記得處理器的一個實例,我可以通過構造函數注入它,但由於處理器被設計為不可變的,我每次都需要一個新的。
我將如何使用Guice(2.0)實現這一目標?
自從我現在使用Guice以來已經有一段時間了,但我記得有一種叫做“輔助注射”的東西。 它允許您定義一個工廠方法,其中提供了一些參數並注入了一些參數。 您可以注入處理器工廠,而不是注入處理器工廠,該工廠具有采用anInputValue
參數的工廠方法。
我指向FactoryProvider的javadoc 。 我相信它應該對你有用。
您可以通過注入“提供程序”來獲得所需的效果,可以在運行時詢問為您提供處理器。 提供者提供了一種在請求之前推遲構造對象的方法。
提供商看起來像
public class ProcessorProvider implements Provider<Processor> {
public Processor get() {
// construct and return a Processor
}
}
由於提供者是由Guice構建和注入的,因此他們自己可以注入比特。
你的代碼看起來像
@Inject
public MyClass(ProcessorProvider processorProvider) {
this.processorProvider = processorProvider;
}
public boolean myMethod(String anInputValue) {
return processorProvider.get().isEnabled(anInputValue);
}
您的處理器是否需要在整個生命周期內訪問anInputValue
? 如果沒有,可以將值傳入您正在使用的方法調用,例如:
@Inject
public MyClass(Processor processor) {
this.processor = processor;
}
public boolean myMethod(String anInputValue) {
return processor.isEnabled(anInputValue);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.