Java 循环依赖的HK2注入

Java 循环依赖的HK2注入,java,dependency-injection,hk2,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; @I

我使用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.getServiceStateManager.classto获取此图时,会出现循环依赖项异常。做这样的事情有什么好处?

你应该能够注射。来自Javadoc

提供T的实例。通常由喷油器实现。对于任何可以注入的类型T,您也可以注入提供程序。与直接注入T相比,注入提供程序支持:

正在检索多个实例。 对实例的延迟或可选检索。 打破循环依赖关系。 抽象范围,以便可以从包含范围中的实例中查找较小范围中的实例。 那你需要的时候就打电话给get

B b = bProvider.get();

你应该可以注射。来自Javadoc

提供T的实例。通常由喷油器实现。对于任何可以注入的类型T,您也可以注入提供程序。与直接注入T相比,注入提供程序支持:

正在检索多个实例。 对实例的延迟或可选检索。 打破循环依赖关系。 抽象范围,以便可以从包含范围中的实例中查找较小范围中的实例。 那你需要的时候就打电话给get

B b = bProvider.get();

我宁愿避免在我的域模型中使用提供者。但是,如果无法避免,那就这样吧。然而,即使这样做了。我通过调用aProvider.get添加了PostConstruct方法来获取实际实例。问题是,我还在一个不使用smProvider.get的文件中添加了PostConstruct,它再次进入循环依赖。使用setter似乎是打破这一局面的唯一办法,到目前为止,我一直在努力避免使用setter。当您使用提供者时,通常无法在后构造中执行get,因为这会导致循环再次出现。HK2保证在将任何内容注入其他内容或查找实例之前,该实例已完全初始化,包括调用PostConstruct,但代理除外。我宁愿避免在域模型中使用提供程序。但是,如果无法避免,那就这样吧。然而,即使这样做了。我通过调用aProvider.get添加了PostConstruct方法来获取实际实例。问题是,我还在一个不使用smProvider.get的文件中添加了PostConstruct,它再次进入循环依赖。使用setter似乎是打破这一局面的唯一办法,到目前为止,我一直在努力避免使用setter。当您使用提供者时,通常无法在后构造中执行get,因为这会导致循环再次出现。HK2保证在将任何内容注入其他内容或查找之前,实例已完全初始化,这包括调用PostConstruct,但代理除外。