我对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
答案 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;范围。