1 回答

TA貢獻1860條經(jīng)驗 獲得超8個贊
我認為您對此并不十分清楚。所以讓我解釋一下。
首先,您創(chuàng)建了一個工廠,您將使用它來創(chuàng)建A. 您這樣做是因為 Guice 不知道 parameter 的值name。
現(xiàn)在你想要的是創(chuàng)建一個B依賴于實例的實例A。您要求 Guice 為您提供一個實例B,但 Guice 將如何創(chuàng)建一個B沒有實例的實例A?您還沒有綁定 的任何實例A。
因此,要解決此問題,您要么必須B手動創(chuàng)建一個實例。
實現(xiàn)它的方法是遵循。
首先,你需要一個工廠B
public interface IBFactory {
IB create(String name);
}
然后你需要在你的類中進行以下更改B
public class B implements IB {
protected final A a;
@AssistedInject
public B(@Assisted String name, IAFactory iaFactory) {
this.a = iaFactory.create(name);
}
}
現(xiàn)在在你的main方法中
public static void main(String[] args) throws Exception {
if(args.size < 1) {
throw new IllegalArgumentException("First arg is required");
}
String name = args[0];
Injector injector = Guice.createInjector(new MyModule());
IBFactory ibFactory = injector.getInstance(IBFactory.class);
IB b = ibFactory.create(name)
System.out.println(b.getA().getName());
}
另外,不要忘記更新您的配置方法并安裝 B 工廠。
protected void configure() {
install(new FactoryModuleBuilder()
.implement(IA.class, A.class)
.build(IAFactory.class));
install(new FactoryModuleBuilder()
.implement(IB.class, B.class)
.build(IBFactory.class));
}
請注意 ,我正在傳遞nameB 類。您可以更新 IBFactory 以作為輔助參數(shù),然后首先創(chuàng)建外部使用IA的實例并將實例傳遞給以創(chuàng)建實例IAIAFactoryIAIBFactoryIB
添加回答
舉報