HK2注入与循环依赖

时间:2015-07-29 15:10:09

标签: 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;
}

我怎样才能实现这样的目标?以上示例仅用于说明。我有比这更多的州。我试着看看它是否重复,但无法找到一个可以解决的问题。当我尝试ServiceLocator.getService(StateManager.class)来获取此图时,我得到循环依赖异常。做这些事情有什么好处?

1 个答案:

答案 0 :(得分:4)

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

  

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

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

然后在需要时致电get()

B b = bProvider.get();