我们都知道,在 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/