循环 ejb 依赖项:规范说明了什么?
circular ejb dependencies: what does the spec say?
根据经验,我知道在 EJB 中注入循环依赖项确实有效,至少在某些应用程序服务器中是这样。
我已经通过自我注入完成了多次(例如,为@TransactionAttribute、@RolesAllowed、@Asynchronous 等获取 EJB 代理)。
我也用更复杂的图表(A->B->A 等)完成了它,这显然也有效。
我至少在 Glassfish 3/4、Weblogic 和 JBoss 7.3 中做过。也许是 Weblogic,不确定。
现在,我一直试图从规范中找到一些精确的保证,但没有成功。 CDI 中有这方面的规定,但我找不到任何关于它为什么适用于 EJB 的解释。也许有一些间接的?
我正在从 EJB 规范中的一些参考资料中查找与此相关的内容。
我不相信 EJB 规范明确禁止自注入,这意味着它隐含地允许它,因为没有理由让 bean 自己的接口与其他 EJB 的接口不同。实际上,自注入只能用于无状态(和 EJB 3.1 中的单例)而不适用于有状态,因为有状态 bean 的每个 lookup/injection 都会创建一个新实例,这将导致无限回避。对于有状态,您可以注入 SessionContext 并使用 getter 方法来 return a "self-proxy" 而不是使用注入。此技术也适用于 stateless/singleton,并且它可能比使用注入稍微快一些(特别是如果您将结果缓存在与注入相同的实例字段中),因为 EJB 容器可能 return代理比通过 injection/JNDI.
更直接
我可以对这个答案给予的唯一额外授权是,我是 WebSphere Application Server 中 EJB 容器的主要 developers/maintainers 成员之一已有 5 年了。要添加到您的产品列表中,我知道自注入实际上也适用于 WebSphere Application Server。
根据经验,我知道在 EJB 中注入循环依赖项确实有效,至少在某些应用程序服务器中是这样。
我已经通过自我注入完成了多次(例如,为@TransactionAttribute、@RolesAllowed、@Asynchronous 等获取 EJB 代理)。
我也用更复杂的图表(A->B->A 等)完成了它,这显然也有效。
我至少在 Glassfish 3/4、Weblogic 和 JBoss 7.3 中做过。也许是 Weblogic,不确定。
现在,我一直试图从规范中找到一些精确的保证,但没有成功。 CDI 中有这方面的规定,但我找不到任何关于它为什么适用于 EJB 的解释。也许有一些间接的?
我正在从 EJB 规范中的一些参考资料中查找与此相关的内容。
我不相信 EJB 规范明确禁止自注入,这意味着它隐含地允许它,因为没有理由让 bean 自己的接口与其他 EJB 的接口不同。实际上,自注入只能用于无状态(和 EJB 3.1 中的单例)而不适用于有状态,因为有状态 bean 的每个 lookup/injection 都会创建一个新实例,这将导致无限回避。对于有状态,您可以注入 SessionContext 并使用 getter 方法来 return a "self-proxy" 而不是使用注入。此技术也适用于 stateless/singleton,并且它可能比使用注入稍微快一些(特别是如果您将结果缓存在与注入相同的实例字段中),因为 EJB 容器可能 return代理比通过 injection/JNDI.
更直接我可以对这个答案给予的唯一额外授权是,我是 WebSphere Application Server 中 EJB 容器的主要 developers/maintainers 成员之一已有 5 年了。要添加到您的产品列表中,我知道自注入实际上也适用于 WebSphere Application Server。