Dependency injection CDI注入回路

Dependency injection CDI注入回路,dependency-injection,cdi,circular-dependency,jboss-weld,Dependency Injection,Cdi,Circular Dependency,Jboss Weld,在JBoss7.1.1中,我遇到了将CDI注入焊接容器的问题 我得到了以下对象模型: @Stateless class ServiceEjb { @Inject A a; } class A { @Inject B b; } class B { @Inject A a; } 当尝试在我的无状态类中注入A或B时,注入循环并使用javax.enterprise.inject.CreationException崩溃 我尝试了很多事情(范围,A或B上的@Singleton,但没有成功)。 我不想破

在JBoss7.1.1中,我遇到了将CDI注入焊接容器的问题

我得到了以下对象模型:

@Stateless
class ServiceEjb {
@Inject
A a;
}

class A {
@Inject
B b;
}

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

我尝试了很多事情(范围,A或B上的@Singleton,但没有成功)。 我不想破坏代码,这些注入是有意义的

除非循环中至少有一个bean有一个错误,否则任何线索都将非常感谢。

最简单的解决方案是给A或B一个正常作用域。如果你不能给任何一个正常作用域(从代码模型来看,它们似乎都有默认的
@Dependent
伪作用域),你必须寻找其他解决方案。发布真实的代码示例可能会让我们帮助您获得特定的解决方案,但以下是一个开始:

  • A和B可以合并到同一个类中吗
  • 是否可以从a和B中提取一个新类C,以便a和B都
    @Inject
    C而不是彼此
以下是一些与其他解决方案的SO链接,您可能会发现这些链接很有用:


我通过显式使用解决了这个问题。虽然我觉得这应该在引擎盖下通过焊接自动完成,但对我来说情况并非如此。这对我起了作用,解决了我的相关问题

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

class B {
    @Inject
    Provider<A> a; // access with a.get()
}
A类{
@注入
提供程序b;//使用b.get()进行访问
}
B类{
@注入
提供程序a;//使用a.get()进行访问
}

我还没有测试过它,但是使用一个提供程序就足以打破这个循环,也就是说,你不需要在两个类中都使用它。

你应该注入一个实例而不是B(和/或实例而不是A)

谢谢你的快速回复。我不得不承认,正常范围的概念对我来说不是很清楚。您提供的链接涉及@NormalScope,但该链接不存在。如何声明正常范围?会话、应用程序、会话和请求范围都是普通范围。这与伪作用域形成对比:singleton和dependent(这是不在作用域注释中编写时的默认设置)。因此,由于我已经尝试声明作用域,如果我理解得很好,这应该可以工作。我可以尝试使用DAO(由SessionBean访问)访问什么样的范围?谢谢您的帮助!我已经用@ApplicationScoped处理过了!不知道对DAO应用程序进行处理是否是个好主意。这相当于EJBJAR中的单例。