1

我使用 HK2 作为依赖注入框架。我正在我的应用程序中实例化一个状态机。因此,A <-> B 是很有可能的,因为根据输入,可以从 B 转换回 A。

@Singleton 
class StateManager extends SomeInterface{

    @Inject
    private B b;

    @Inject
    private A a;
}

@Singleton 
class A extends State{

    @Inject
    private B b;

    @Inject
    private StateManager sm;

}

@Singleton 
class B extends State{

    @Inject
    private A a;

    @Inject
    private StateManager sm;
}

我怎样才能实现这样的目标?上面的例子只是为了说明。我有比这更多的州。我试图查看它是否是重复的,但找不到可以处理的。当我尝试ServiceLocator.getService(StateManager.class)获取此图时,我得到循环依赖异常。做这样的事情有什么好处?

4

1 回答 1

4

您应该能够注入javax.inject.Provider<B>. 来自 Javadoc

提供T. 通常由注入器实现。对于任何可以注入的类型T,您也可以注入Provider<T>. 与T直接注入相比,注入Provider<T>能够:

  • 检索多个实例。
  • 实例的惰性或可选检索。
  • 打破循环依赖。
  • 抽象范围,以便您可以从包含范围内的实例中查找较小范围内的实例。

然后get()在你需要的时候打电话

B b = bProvider.get();
于 2015-07-29T15:22:31.487 回答