无状态会话 bean 之间的循环依赖 - 好的做法?
Circular dependencies between stateless session beans - good practice?
我只是 运行 在部署两个相互依赖并使用 @Inject 的无状态会话 bean 时出现部署错误。
@Stateless
class BeanA {
@Inject
BeanB b;
public void doSomething() {
b.doSomething();
}
}
@Stateless
class BeanB {
@Inject
BeanA a;
public void doSomeOtherThing() {
a.doSomeOtherThing();
}
}
部署时,我从 Glassfish / weld 得到这个异常:
org.jboss.weld.exceptions.DeploymentException: WELD-001443 Pseudo
scoped bean has circular dependencies.
使用@EJB 而不是@Inject 注入Bean,一切正常。现在我有两个问题。
首先 - 焊缝内部发生了什么不允许这样做?
其次(可能更重要)- 这种做法在架构方面是不好的吗?如果是,您知道有什么模式可以避免吗?据我目前所知,允许同一层上的业务驱动服务以它们需要的任何方式相互通信。
写在spec
The container is not required to support circular chains of
dependencies where every bean participating in the chain has a
pseudo-scope.
在这里,您没有向会话 bean 添加作用域注释,因此它们具有默认作用域 @Dependent
。 Dependent是一个伪作用域,出现这个错误是正常的。
要解决此问题,请将 @ApplicationScoped
添加到至少一个 bean。事实上,将无状态会话 bean 放在应用程序上下文中是一种很好的做法,它可以防止 CDI 在您每次注入时围绕现有 EJB 重新创建其代理。
关于循环,这不是一个坏习惯,但应该只在需要时使用,因为它会给理解您的应用、调试它和防止此类错误带来更多复杂性。
我只是 运行 在部署两个相互依赖并使用 @Inject 的无状态会话 bean 时出现部署错误。
@Stateless
class BeanA {
@Inject
BeanB b;
public void doSomething() {
b.doSomething();
}
}
@Stateless
class BeanB {
@Inject
BeanA a;
public void doSomeOtherThing() {
a.doSomeOtherThing();
}
}
部署时,我从 Glassfish / weld 得到这个异常:
org.jboss.weld.exceptions.DeploymentException: WELD-001443 Pseudo scoped bean has circular dependencies.
使用@EJB 而不是@Inject 注入Bean,一切正常。现在我有两个问题。
首先 - 焊缝内部发生了什么不允许这样做?
其次(可能更重要)- 这种做法在架构方面是不好的吗?如果是,您知道有什么模式可以避免吗?据我目前所知,允许同一层上的业务驱动服务以它们需要的任何方式相互通信。
写在spec
The container is not required to support circular chains of dependencies where every bean participating in the chain has a pseudo-scope.
在这里,您没有向会话 bean 添加作用域注释,因此它们具有默认作用域 @Dependent
。 Dependent是一个伪作用域,出现这个错误是正常的。
要解决此问题,请将 @ApplicationScoped
添加到至少一个 bean。事实上,将无状态会话 bean 放在应用程序上下文中是一种很好的做法,它可以防止 CDI 在您每次注入时围绕现有 EJB 重新创建其代理。
关于循环,这不是一个坏习惯,但应该只在需要时使用,因为它会给理解您的应用、调试它和防止此类错误带来更多复杂性。