【问题标题】:do EJBs get injected on a servlet everytime a request is done on the servlet?每次在 servlet 上完成请求时,是否会在 servlet 上注入 EJB?
【发布时间】:2012-01-29 15:14:13
【问题描述】:

我正在尝试复制 MVC 设计模式。这就是我所做的,我有一个处理所有请求的 servlet。其中,是注入的 ejb。所以在这个控制器/servlet 中使用@EJB 注释声明了 7 到 15 个 ejb。

我只想问一下,例如,1 个用户是否调用了主控制器/servlet。 ejb 是否仅在该调用中被注入,或者每次用户调用 servlet 时它们是否每次都被注入?还是在第一次创建 servlet 时注入 ejb?

【问题讨论】:

  • 感谢编辑@DataNucleus

标签: java servlets ejb


【解决方案1】:

注入是在创建对象时完成的,并且由于 Servlet 容器通常(但不是强制性的 - 在单线程模型的情况下)创建一个 servlet 的单个实例,然后在单独的线程中提供请求,因此您的 EJB 应该是创建一次,以防您不使用 SingleThreadModel。

【讨论】:

  • 这不是真的。 SingleThreadModel 仅表示 servlet 一次只能服务一个线程。 servlet 容器将始终只创建一次 servlet 实例(无论是否为单线程模型)。
  • @Kal 检查 Servlet 规范 - SRV.2.2.1 它说 --- “SingleThreadModel 接口的使用保证了一次只有一个线程将在给定的 servlet 实例的服务方法中执行。需要注意的是,这种保证仅适用于每个 servlet 实例,因为容器可能会选择池化此类对象”,这实质上意味着可以有多个实例
【解决方案2】:

在创建对象时注入资源(因为您不能注入静态字段,只能注入成员变量)。

在 servlet 的情况下,servlet 类由 servlet 容器加载,然后创建一个实例。此时,@EJB or @Resource 被注入。然后容器调用init()方法

【讨论】:

  • 感谢您的澄清,只是为了确保我做对了,在创建 servlet 之后(因此它是 ejbs)然后,如果 10 个用户将访问 servlet,则在该过程中创建或注入ejb 不会再发生了,因为它已经在它创建的第一个地方完成了
  • 是的。除非它们是有状态的会话 bean。在这种情况下,您将拥有与会话数一样多的会话。
猜你喜欢
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 2016-03-08
相关资源
最近更新 更多