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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

明月笑刀無情 2023-06-04 19:48:15
我試圖將一個具有運行時變量的對象傳遞給另一個對象。我如何使用 Guice 實現(xiàn)這一目標?我是依賴注入的新手。我想創(chuàng)建幾個 A 對象(它們的數(shù)量在運行時決定)和許多使用 A 對象的 B 對象。但首先讓我們從他們兩個的一個對象開始。感謝您的幫助。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 回答

?
桃花長相依

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


查看完整回答
反對 回復 2023-06-04
  • 1 回答
  • 0 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號