Guice multibinding-instances获得不同的依赖实例

时间:2015-12-07 15:10:59

标签: java dependency-injection guice

我对Guice很新,我现在有点陷入困境。

我正在为Java中的小游戏开发后端。我想用Guice动态注入游戏系统,我正在使用多重绑定:

private class InstanceModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(GameInstance.class).to(GameInstanceImplementation.class);
        bind(EntityManager.class).to(EntityManagerImplementation.class);
        bind(EventBus.class).to(EventBusImplementation.class);
        bind(MessageBroker.class).toInstance(broker);

        Multibinder<GameSystem> systemBinder = Multibinder.newSetBinder(binder(), GameSystem.class);

        for (Class<? extends GameSystem> systemClass : systemsConfig) {
            systemBinder.addBinding().to(systemClass);
        }
    }
}

systemsConfig只是我要加载游戏的GameSystem类的列表。

在我的GameInstanceImplementation.class中,我会像这样注入使用过的GameSystems

@Inject
public void setSystems(Set<IPMSystem> systems) {
    this.systems = systems;
}

我得到像这样的GameInstance:

GameInstance instance = injector.getInstance(GameInstance.class);

我这样做,因为每个GameSystem都有不同的依赖关系,有些只需要EntityManager,有些需要EventBus等等。

现在似乎每个GameSystem都有不同的EventBus,EntityManager等......因此他们当然无法相互通信。

我期待每个GameSystem获得绑定依赖项的相同实例。

我在这里缺少什么?

提前致谢, Froschfanatika

1 个答案:

答案 0 :(得分:1)

默认情况下,Guice会在每次创建对象时创建每个依赖项的新实例。如果要更改该行为,并在对象之间共享一些依赖项,则需要将这些依赖项放入不同的范围。

所以,而不是......

bind(EventBus.class).to(EventBusImplementation.class);
你会做点什么......

bind(EventBus.class).to(EventBusImplementation.class)
                    .in(Singleton.class);

然后Guice将只创建一个EventBus实现的单个实例,并且任何需要EventBus作为依赖关系的东西都将被赋予该单个实例。

值得注意的是,Guice在这方面的行为与Spring不同。 Spring DI默认将所有bean视为单例。 Guice默认值更类似于Spring所称的&#39; prototype&#39;范围。

https://github.com/google/guice/wiki/Scopes