第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何注入使用 Guice 中的輔助注入創(chuàng)建的對(duì)象?

如何注入使用 Guice 中的輔助注入創(chuàng)建的對(duì)象?

明月笑刀無情 2023-06-04 19:48:15
我試圖將一個(gè)具有運(yùn)行時(shí)變量的對(duì)象傳遞給另一個(gè)對(duì)象。我如何使用 Guice 實(shí)現(xiàn)這一目標(biāo)?我是依賴注入的新手。我想創(chuàng)建幾個(gè) A 對(duì)象(它們的數(shù)量在運(yùn)行時(shí)決定)和許多使用 A 對(duì)象的 B 對(duì)象。但首先讓我們從他們兩個(gè)的一個(gè)對(duì)象開始。感謝您的幫助。public interface IA {    String getName();}public class A implements IA {    @Getter    protected final String name;    @AssistedInject    A(@Assisted String name) {        this.name = name;    }}public interface IAFactory {    IA create(String name);}public interface IB {    IA getA();}public class B implements IB {      @Getter    protected final IA a;    //...    // some more methods and fields    //...    @Inject    B(IA a) {        this.a = a;    }}public class MyModule extends AbstractModule {    @Override    protected void configure() {        install(new FactoryModuleBuilder()         .implement(IA.class, A.class)         .build(IAFactory.class));        bind(IB.class).to(B.class);    }}public class 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());        IB b = injector.getInstance(IB.class);        System.out.println(b.getA().getName());    }}
查看完整描述

1 回答

?
桃花長(zhǎng)相依

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


查看完整回答
反對(duì) 回復(fù) 2023-06-04
  • 1 回答
  • 0 關(guān)注
  • 190 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)