【问题标题】:Can I mix DI and JNDI lookup when working with EJB?使用 EJB 时可以混合使用 DI 和 JNDI 查找吗?
【发布时间】:2023-03-16 06:16:01
【问题描述】:

我开始学习 EJB 技术。我的问题受到 youtube 指南的启发:https://www.youtube.com/watch?v=NM61Xt7SGmk。它有点长,所以我会尽量简短地说:

介绍了两种使用 EJB 的方式:

  1. 手动创建 javax.naming.InitialContext 对象,然后获取 EJB 使用 .lookup(String jndiPath) 方法获取 EJB 实例。
  2. 使用依赖注入:使用 @EJB 等注解,并让容器管理所有这些 EJB 引用。

如果有人在一个应用程序(.ear 或 .war)中不一致地使用上述两种方法怎么办?手动创建的上下文(在 1. 点中)和容器创建的上下文(在 2. 点中)是否是相同的上下文?它会导致不必要的重复 EJB 实例吗?它会首先起作用吗?

【问题讨论】:

    标签: jakarta-ee dependency-injection ejb jndi


    【解决方案1】:

    回答您问题的第一部分。

    许多大型项目有时会发现自己同时使用这两种机制。这通常会在以下情况下发生:

    1. 应用程序需要访问远程 ejb(可能在不同的服务器上运行)。应用程序将不得不通过 InitialContext 手动查找
    2. 当应用程序定义自己的 ejb 时,它会简单地使用 EJB 注入。但是,同样允许在此处进行手动查找。唯一的原因是它是不必要的,当你可以让容器为你做这件事时。
    3. EJB 规范允许无状态 EJB 池,因此每个请求都可以由不同的 ejb bean 实例处理。如果在您的问题中您指的​​是不同的情况,则可能是这种情况。但还要注意,注入的对象可以(并且大部分是)实际 bean 实现的代理。对于 Singleton bean,容器保证 bean 在执行上下文中的单个实例,因此无论您进行手动查找还是 ejb 注入,它都会为您提供相同的 bean。
    4. 有状态的 ejb 具有状态,并且必须维护客户端会话。如果您在同一个客户端会话中,手动查找或注入会给出相同的实例(可能这部分需要更多说明)

    所以要回答你问题的最后一部分,不会有任何重复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 2012-09-22
      • 2013-02-02
      • 2016-08-04
      相关资源
      最近更新 更多