从我们部署 ejb 组件的那一刻起,@EJB 注释是如何在 EJB 容器 3.x 中处理的?

How @EJB annotation is processed in EJB container 3.x from the moment when we deploy ejb components?

有关 ejb 会话 bean 用作注入 bean 实例时的行为的问题。 我不是 100% 确定这是如何工作的。我从实践和阅读有关该主题的文档中猜测。 想详细了解@EJB注解是如何被容器处理的

会话 bean 有接口、impl class、部署描述符。我们将它们打包在 ejb jar 中。

  1. 容器在全局JNDI中放了什么?静态引用 业务接口?
  2. 如何以及何时从中读取全局 JNDI?
  3. 当使用 ejb 引用填充组件 JNDI ENC 时?
  4. Is this reference in JNDI ENC (java:comp/env/beanB) is reference to 会话 bean 组件接口、会话 bean 实例代理或 会话 bean 实例? SLSB 和 SFSB 有区别吗?
  5. 每个新的 ejb 会话 bean 在字段上使用 @EJB 注释 实例在注释字段中获取注入的 ejb 的新实例或 所有 ejb 实例共享同一个注入的 ejb 会话 bean 实例 ?
  6. 通过查找(在会话上下文中)进行的 ejb 注入是否总是提供新的 注入的 ejb 实例,示例:调用 ctx.lookup(ejbReference) in 循环 ?
  1. 在 EJB 3.0 中,JNDI 名称是特定于供应商的(如果可用的话;理论上,容器只能支持 EJB 引用),但供应商通常 return EJB reference/proxy。在 EJB 3.1 中,规范要求 EJB 容器提供特定的 java:globaljava:appjava:module 名称,并且从这些查找中 return 的对象必须是 EJB reference/proxy.
  2. 执行 JNDI 查找时会访问全局 JNDI。在其他情况下,容器可能会访问全局 JNDI 名称(例如,在解析 @EJB(lookup="java:app/...") 时)。
  3. 容器填充时未定义java:,但内容必须在组件实例上调用生命周期回调或业务方法之前可用。
  4. @EJB/<ejb-ref>/<ejb-local-ref> 确保查找总是 return EJB reference/proxy 而不是实际的 bean 实例。代理确保在调用实际 bean 实例之前执行所有容器服务(安全、事务、远程处理等)。对于 SLSB,将调用任意 bean 实例,根据线程、并发、时序、供应商特定配置等,可​​能会调用相同或不同的实际实例。对于 SFSB,将调用具有特定标识的 bean 实例;您可能会获得相同的 bean 实例,但如果 EJB 容器已钝化实际的 bean 实例,您可能不会,但重新激活应该会导致具有等效状态的实例。对于 EJB 3.1 中的单例会话 bean,保证会调用单例 bean 实例。
  5. 是否获取同一个代理实例未定义。对于 SLSB 和单例 bean,注入或查找可以 return 委托给实际 bean 实例的单个代理,如上所述。对于 SFSB,代理基本上需要在每次注入或查找时成为一个单独的实例,因为代理必须存储一些具有标识的状态,以便它可以调用特定的实际 bean 实例。
  6. 未定义容器的作用,但注入通常由使用 Context.lookup 后跟 Field.set 的容器实现(或 Method.invoke 用于 setter 方法注入)。无论如何,实例处理如上所述。