1 回答
TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超8個(gè)贊
我認(rèn)為您對(duì)此并不十分清楚。所以讓我解釋一下。
首先,您創(chuàng)建了一個(gè)工廠,您將使用它來創(chuàng)建A. 您這樣做是因?yàn)?Guice 不知道 parameter 的值name。
現(xiàn)在你想要的是創(chuàng)建一個(gè)B依賴于實(shí)例的實(shí)例A。您要求 Guice 為您提供一個(gè)實(shí)例B,但 Guice 將如何創(chuàng)建一個(gè)B沒有實(shí)例的實(shí)例A?您還沒有綁定 的任何實(shí)例A。
因此,要解決此問題,您要么必須B手動(dòng)創(chuàng)建一個(gè)實(shí)例。
實(shí)現(xiàn)它的方法是遵循。
首先,你需要一個(gè)工廠B
public interface IBFactory {
IB create(String name);
}
然后你需要在你的類中進(jìn)行以下更改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));
}
請(qǐng)注意 ,我正在傳遞nameB 類。您可以更新 IBFactory 以作為輔助參數(shù),然后首先創(chuàng)建外部使用IA的實(shí)例并將實(shí)例傳遞給以創(chuàng)建實(shí)例IAIAFactoryIAIBFactoryIB
添加回答
舉報(bào)
