我使用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)
来获取此图时,我得到循环依赖异常。做这些事情有什么好处?
答案 0 :(得分:4)
你应该能够注射javax.inject.Provider<B>
。来自Javadoc
提供
T
的实例。通常由注射器实施。对于可以注入的任何类型T
,您还可以注入Provider<T>
。与直接注入T
相比,注入Provider<T>
会启用:
- 检索多个实例。
- 懒惰或可选的实例检索。
- 打破循环依赖。
- 抽象范围,以便您可以在包含范围内的实例中查找较小范围内的实例。
然后在需要时致电get()
B b = bProvider.get();