为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

明月笑刀无情 2023-06-04 19:48:15
我试图将一个具有运行时变量的对象传递给另一个对象。我如何使用 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());    }}
查看完整描述

1 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

我认为您对此并不十分清楚。所以让我解释一下。


首先,您创建了一个工厂,您将使用它来创建A. 您这样做是因为 Guice 不知道 parameter 的值name。


现在你想要的是创建一个B依赖于实例的实例A。您要求 Guice 为您提供一个实例B,但 Guice 将如何创建一个B没有实例的实例A?您还没有绑定 的任何实例A。


因此,要解决此问题,您要么必须B手动创建一个实例。


实现它的方法是遵循。


首先,你需要一个工厂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);

    }

}

现在在你的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 以作为辅助参数,然后首先创建外部使用IA的实例并将实例传递给以创建实例IAIAFactoryIAIBFactoryIB


查看完整回答
反对 回复 2023-06-04
  • 1 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信