Dependency injection CDI注入回路
在JBoss7.1.1中,我遇到了将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,但没有成功)。 我不想破
@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都
C而不是彼此@Inject
我通过显式使用解决了这个问题。虽然我觉得这应该在引擎盖下通过焊接自动完成,但对我来说情况并非如此。这对我起了作用,解决了我的相关问题
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中的单例。