java - 具有循环依赖的 HK2 注入(inject)

标签 java dependency-injection hk2

我使用 HK2 作为依赖注入(inject)框架。我正在我的应用程序中实例化一个状态机。因此,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) 获取此图时,出现循环依赖异常。做这样的事情有什么好处?

最佳答案

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

Provides instances of T. Typically implemented by an injector. For any type T that can be injected, you can also inject Provider<T>. Compared to injecting T directly, injecting Provider<T> enables:

  • retrieving multiple instances.
  • lazy or optional retrieval of an instance.
  • breaking circular dependencies.
  • abstracting scope so you can look up an instance in a smaller scope from an instance in a containing scope.

然后调用get()当你需要的时候

B b = bProvider.get();

关于java - 具有循环依赖的 HK2 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31704384/

相关文章:

c# - CaSTLe Windsor接口(interface)的多种实现

ios - View Controller 、依赖注入(inject)和 init/viewDidLoad

java - 如何使 HK2 ServiceLocator 使用桥接的 ServiceLocator 中的 Singleton 服务实例?

java - 在 Android 应用程序中设置单个静态 applicationContext 有哪些缺点?

java - 暂时提高多线程服务中的log4j2记录器级别

java - HBase:使用MapReduce更新行?

java - 无法在 spring cloud 配置服务器中禁用解密服务器端

php - 如何在不牺牲依赖注入(inject)的情况下简化 API?

java - CDI 注入(inject)源在 Jersey 子资源中不可用

java - 如何在 HK2 中注入(inject)未绑定(bind)的泛型类型?