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

时间:2016-08-08 15:30:43

标签: ejb ejb-3.0 ejb-3.1

用作注入bean实例时有关ejb会话bean行为的问题。 我不能100%确定这是如何运作的。我想从实践和阅读有关该主题的文件。 我想知道容器是如何处理@EJB注释的。

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

  1. 容器中全局JNDI的内容是什么?静态引用 业务接口?
  2. 如何以及何时从中读取全局JNDI?
  3. 当组件JNDI ENC填充了ejb reference?
  4. JNDI ENC(java:comp / env / beanB)中的引用是否引用 会话bean组件接口,会话bean实例代理或 会话bean实例? SLSB和SFSB有区别吗?
  5. 使用@EJB annotation on field执行每个新的ejb会话bean 实例在注释字段中获取注入的ejb的新实例 所有ejb实例共享相同的注入ejb会话bean实例 ?
  6. 通过查找(在会话上下文中)注入ejb是否始终是新的 注入ejb实例,例如:调用ctx.lookup(ejbReference) 循环?

1 个答案:

答案 0 :(得分:1)

  1. 在EJB 3.0中,JNDI名称是特定于供应商的(如果可用的话;理论上,容器只能支持EJB引用),但供应商通常返回EJB引用/代理。在EJB 3.1中,规范要求EJB容器使特定的java:globaljava:appjava:module名称可用,并且从这些查找返回的对象必须是EJB引用/代理。 / LI>
  2. 执行JNDI查找时,将访问全局JNDI。在其他情况下,容器可能会访问全局JNDI名称(例如,在解析@EJB(lookup="java:app/...")时)。
  3. 当容器填充java:时未定义,但在组件实例上调用生命周期回调或业务方法之前,内容必须可用。
  4. @EJB / <ejb-ref> / <ejb-local-ref>确保查找始终返回EJB引用/代理,而不是实际的bean实例。代理确保在调用实际的bean实例之前执行所有容器服务(安全性,事务,远程处理等)。对于SLSB,将调用任意bean实例,并且可能会调用相同或不同的实际实例,具体取决于线程,并发,时序,特定于供应商的配置等。对于SFSB,将调用具有特定标识的Bean实例;您可能会获得相同的bean实例,但如果EJB容器已钝化实际的bean实例,则可能不会,但重新激活应该会导致具有等效状态的实例。对于EJB 3.1中的单例会话bean,可以保证将调用单例bean实例。
  5. 未定义是否获得相同的代理实例。对于SLSB和单例bean,注入或查找可以返回一个委托给实际bean实例的单个代理,如上所述。对于SFSB,代理基本上需要是每次注入或查找的单独实例,因为代理必须存储具有标识的某个状态,以便它可以调用特定的实际bean实例。
  6. 未定义容器的功能,但注入通常由容器使用Context.lookup后跟Field.set(或Method.invoke进行setter方法注入)来实现。无论如何,实例处理如上所述。