【问题标题】: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 的方式:
- 手动创建 javax.naming.InitialContext 对象,然后获取 EJB 使用 .lookup(String jndiPath) 方法获取 EJB 实例。
- 使用依赖注入:使用 @EJB 等注解,并让容器管理所有这些 EJB 引用。
如果有人在一个应用程序(.ear 或 .war)中不一致地使用上述两种方法怎么办?手动创建的上下文(在 1. 点中)和容器创建的上下文(在 2. 点中)是否是相同的上下文?它会导致不必要的重复 EJB 实例吗?它会首先起作用吗?
【问题讨论】:
标签:
jakarta-ee
dependency-injection
ejb
jndi
【解决方案1】:
回答您问题的第一部分。
许多大型项目有时会发现自己同时使用这两种机制。这通常会在以下情况下发生:
- 应用程序需要访问远程 ejb(可能在不同的服务器上运行)。应用程序将不得不通过 InitialContext 手动查找
- 当应用程序定义自己的 ejb 时,它会简单地使用 EJB 注入。但是,同样允许在此处进行手动查找。唯一的原因是它是不必要的,当你可以让容器为你做这件事时。
- EJB 规范允许无状态 EJB 池,因此每个请求都可以由不同的 ejb bean 实例处理。如果在您的问题中您指的是不同的情况,则可能是这种情况。但还要注意,注入的对象可以(并且大部分是)实际 bean 实现的代理。对于 Singleton bean,容器保证 bean 在执行上下文中的单个实例,因此无论您进行手动查找还是 ejb 注入,它都会为您提供相同的 bean。
- 有状态的 ejb 具有状态,并且必须维护客户端会话。如果您在同一个客户端会话中,手动查找或注入会给出相同的实例(可能这部分需要更多说明)
所以要回答你问题的最后一部分,不会有任何重复。