servlets - 将 EJB 作为实例变量注入(inject)到 servlet 中是否安全?

标签 servlets ejb-3.0 code-injection

我们都知道,在 Web 层中,可能只存在给定 Servlet 的单个实例来为多个请求提供服务。这可能会导致实例变量中的线程问题。

我的问题是,使用 @EJB 注释将 EJB 作为实例变量注入(inject)到 servlet 中是否安全?

我最初的直觉是否定的,因为假设 EJB 的同一实例将同时服务多个请求。这似乎也是许多其他程序员的本能: Don't inject to servlets

但是我得出了错误的结论。显然,注入(inject)到 servlet 中的是代理,在幕后容器是否实际上使用不同的实例为每个请求提供服务并维护线程安全?正如该论坛建议的那样:Do inject to servlets

似乎有很多相互矛盾的意见。哪个是正确的???

最佳答案

只要 EJB 是无状态的,就可以安全地将 EJB 作为 Servlet 实例变量注入(inject)到 Servlet 中。您绝对不能在 Servlet 中注入(inject) Stateful Bean。

您必须实现无状态 EJB,因为它不包含任何本身包含有状态值的实例变量(如持久性上下文)。如果您需要使用持久性上下文,那么您必须在 EJB 的方法中获取它的实例。您可以通过将 PersistenceContextFactory 作为 EJB 实例变量来做到这一点,然后在 EJB 的方法中从工厂获取实体管理器的实例。

PersistenceContextFactory 是线程安全的,因此可以将其注入(inject)到实例变量中。

只要遵守上述规则,在 Servlet 中注入(inject) Stateless Bean 应该是线程安全的

关于servlets - 将 EJB 作为实例变量注入(inject)到 servlet 中是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/618440/

相关文章:

Java Servlet - 导致空响应对象的观察者模式

javascript - 通过href将值从jsp页面传递到servlet

java - 使用 html 表单时 servlet 404 发现错误

objective-c - 是否有任何示例/教程告诉您如何从 iPhone 应用程序调用 J2EE 服务器上的 servlet?

authentication - 可以从自定义 LoginModule 访问远程 EJB 吗?

java - 在 EJB Helper 类中查找实体管理器

jakarta-ee - EJB 事务 REQUIRE_NEW

java - 使用 Spring 自动依赖注入(inject)

javascript - grunt服务删除index.html中对openlayers.js的引用

delphi - 使用 DLL 注入(inject)在另一个进程中附加菜单项