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