猿问

如何注入使用 Guice 中的辅助注入创建的对象?

我试图将一个具有运行时变量的对象传递给另一个对象。我如何使用 Guice 实现这一目标?我是依赖注入的新手。


我想创建几个 A 对象(它们的数量在运行时决定)和许多使用 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());

    }

}


明月笑刀无情
浏览 114回答 1
1回答

桃花长相依

我认为您对此并不十分清楚。所以让我解释一下。首先,您创建了一个工厂,您将使用它来创建A. 您这样做是因为 Guice 不知道 parameter 的值name。现在你想要的是创建一个B依赖于实例的实例A。您要求 Guice 为您提供一个实例B,但 Guice 将如何创建一个B没有实例的实例A?您还没有绑定 的任何实例A。因此,要解决此问题,您要么必须B手动创建一个实例。实现它的方法是遵循。首先,你需要一个工厂Bpublic interface IBFactory {&nbsp; &nbsp; IB create(String name);}然后你需要在你的类中进行以下更改Bpublic class B implements IB {&nbsp;&nbsp;&nbsp; &nbsp; protected final A a;&nbsp; &nbsp; @AssistedInject&nbsp; &nbsp; public B(@Assisted String name, IAFactory iaFactory) {&nbsp; &nbsp; &nbsp; &nbsp; this.a = iaFactory.create(name);&nbsp; &nbsp; }}现在在你的main方法中public static void main(String[] args) throws Exception {&nbsp; &nbsp; if(args.size < 1) {&nbsp; &nbsp; &nbsp; &nbsp; throw new IllegalArgumentException("First arg is required");&nbsp; &nbsp; }&nbsp; &nbsp; String name = args[0];&nbsp; &nbsp; Injector injector = Guice.createInjector(new MyModule());&nbsp; &nbsp; IBFactory ibFactory = injector.getInstance(IBFactory.class);&nbsp; &nbsp; IB b = ibFactory.create(name)&nbsp; &nbsp; System.out.println(b.getA().getName());}另外,不要忘记更新您的配置方法并安装 B 工厂。protected void configure() {&nbsp; &nbsp; install(new FactoryModuleBuilder()&nbsp; &nbsp; &nbsp;.implement(IA.class, A.class)&nbsp; &nbsp; &nbsp;.build(IAFactory.class));&nbsp; &nbsp; install(new FactoryModuleBuilder()&nbsp; &nbsp; &nbsp;.implement(IB.class, B.class)&nbsp; &nbsp; &nbsp;.build(IBFactory.class));}请注意 ,我正在传递nameB 类。您可以更新 IBFactory 以作为辅助参数,然后首先创建外部使用IA的实例并将实例传递给以创建实例IAIAFactoryIAIBFactoryIB
随时随地看视频慕课网APP

相关分类

Java
我要回答