CDI注射循环

jmc*_*n92 5 dependency-injection circular-dependency cdi jboss-weld

我在JBoss 7.1.1中遇到了CDI Injection进入Weld容器的问题

我有以下对象模型:

@Stateless
class ServiceEjb {
@Inject
A a;
}

class A {
@Inject
B b;
}

class B {
@Inject
A a;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试在我的无状态类中注入A或B时,注入循环并使用javax.enterprise.inject.CreationException崩溃.

我尝试了很多东西(范围,@ Singleton在A或B但没有成功).我不想打破代码,那些注射让人感觉到了.

任何线索将不胜感激.

Nic*_*ick 11

CDI标准不要求循环依赖注入,除非循环中至少有一个bean具有正常范围.最简单的解决方案是给A或B一个正常的范围.如果你不能给出正常范围(从代码模型开始,看起来它们都有默认的@Dependent伪范围),你将不得不寻找其他解决方案.发布真实的代码示例可能会让我们帮助您解决特定的解决方案,但这是一个开始:

  • A和B可以组合成同一个类吗?
  • 可以从A和B中提取新类C,以便A和B @InjectC相互代替吗?

以下是您可能会发现有用的其他解决方案的SO链接:

带CDI的MVP; 避免循环依赖

/sf/ask/983117691/


jan*_*jan 5

我通过显式使用javax.inject.Provider解决了该问题。虽然我觉得这应该由 WELD 在幕后自动完成,但对我来说情况并非如此。这对我有用并解决了我的相关问题。

class A {
    @Inject
    Provider<B> b; // access with b.get()
}

class B {
    @Inject
    Provider<A> a; // access with a.get()
}
Run Code Online (Sandbox Code Playgroud)

我还没有测试过它,但使用一个 Provider 来打破循环就足够了,即您不需要在两个类中都使用它。