java - 谷歌Guice : use injected factory to instantiate multiple objects in a class?

标签 java dependency-injection guice

public class AppModule extends AbstractModule {
    @Override
    protected void configure() {
        install(new FactoryModuleBuilder().implement(BaseClass.class, ImplementingClass.class).build(FactoryClass.class));
    }
}

public class AnotherClass {
    @Inject
    private FactoryClass factoryClass;

    private BaseClass firstBaseObject = factoryClass.create("some_parameter");
    private BaseClass secondBaseObject = factoryClass.create("another_parameter");

    public void processSomething() {
        // ... do something that requires both firstBaseObject and secondBaseObject to already be initialized on each call
    }
}

有没有办法让我在每次调用 processSomething() 时都可以访问 firstBaseObjectsecondBaseObjectprocessSomething() 的每次调用都依赖于已经实例化的这两个对象,并且它们是具有大量元数据的巨大对象。即,我可以以某种方式确保在命中这两行时 factoryClass 已经实例化吗?:

    private BaseClass firstBaseObject = factoryClass.create("some_parameter");
    private BaseClass secondBaseObject = factoryClass.create("another_parameter");

我在这两行上收到 NullPointerExceptions,因为 factoryClass 为 null。

如果您需要更多信息,请告诉我,非常感谢!

最佳答案

使用下面的代码

public class AnotherClass {
    private final BaseClass firstBaseObject;
    private final BaseClass secondBaseObject;

    @Inject
    public AnotherClass(FactoryClass factoryClass) {
       firstBaseObject = factoryClass.create("some_parameter");
       secondBaseObject = factoryClass.create("another_parameter");
    }

    public void processSomething() {
        // ... do something that requires both firstBaseObject and secondBaseObject to already be initialized on each call
    }
}

不能使用字段或方法注入(inject),因为factoryClass中的注入(inject)是在填充firstBaseObject和secondBaseObject之后进行的。

或者

public class AppModule extends AbstractModule {
    @Override
    protected void configure() {
        ...
        bind(BaseClass.class)
        .annotatedWith(Names.named("firstBaseObject"))
        .toInstance(factoryClass.create("some_parameter"));

        bind(BaseClass.class)
        .annotatedWith(Names.named("secondBaseObject"))
        .toInstance(factoryClass.create("another_parameter"));
    }
}

public class AnotherClass {
    @Inject
    @Named("firstBaseObject")
    private BaseClass firstBaseObject;
    @Inject
    @Named("secondBaseObject")
    private BaseClass secondBaseObject;

    public void processSomething() {
        // ... do something that requires both firstBaseObject and secondBaseObject to already be initialized on each call
    }
}

关于java - 谷歌Guice : use injected factory to instantiate multiple objects in a class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34279529/

相关文章:

java - 使用泛型列表进行快速排序时索引越界异常

spring - 如何在@InjectMockKs 测试实例中注入(inject)实现列表?

angular - 在不同的 token 下提供相同的服务实例

c# - 如何在 MVC .Net Core 的依赖注入(inject)框架中利用完全相同的对象实例

java - Guice FactoryBuilderModule 生成工厂时出现 NullPointerException

java - REST 异步操作抛出 ProcessingException

java - 尝试在空对象引用上调用虚拟方法 'java.util.Set android.bluetooth.BluetoothAdapter.getBondedDevices()'

java - 如何在android中使用Chart自定义条形图

java - 在 Guice 中注入(inject)对象数组

java - 使用 Guice 优化注册表