带有循环依赖的 HK2 注入

cha*_*raj 1 java dependency-injection hk2

我使用 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*tha 6

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

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

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

get()然后需要的时候打电话就可以了

B b = bProvider.get();
Run Code Online (Sandbox Code Playgroud)