上下文和依赖关系注入 (CDI) 与 EJB 容器集成
CDI 规范使用上下文生命周期管理增强 EJB 组件模型。
CDI 与 EJB 规范的关系
EJB 规范为在多用户环境中访问事务资源的应用程序组件定义编程模型。基于角色的安全性、事务定界、并行和可伸缩性等事项,通过使用 EJB 容器在运行时强制实施的注释和 XML 部署描述符以声明方式指定。EJB 组件可能具有状态,但本身不具有上下文。
以下会话 bean 实例通过使用依赖性注入获取:
- 具有上下文
- 绑定到生命周期上下文
- 可用于在此上下文中启动的其他实例
- 需要时,容器会创建实例
- 上下文结束时容器会删除实例
WebSphere® Application Server(传统) CDI 容器对所有会话和消息驱动的 bean 实例(包括不具有上下文的实例)执行依赖性注入。WebSphere Application Server CDI 支持在企业 bean 内部执行 CDI bean 注入,反之亦然。
用法

- 将 @Inject 方法用于本地会话 bean 的上下文注入。
- 将 @EJB 方法用于远程会话 bean
定义生产者,这些生产者使 EJB 可用于非上下文注入:
@Produces @EJB PaymentService paymentService;
在其他 CDI bean 中使用已注入的类型:
@Inject PaymentService myPaymentService
实际注意事项
您可以使用拦截器绑定和修饰符企业 bean 定义 CDI 样式拦截器。 拦截器使用 @Interceptors 方法声明或在 ejb-jar.xml 文件中声明,这些方法和文件在拦截器之前调用,并通过使用拦截器绑定进行声明。在修饰符之前调用拦截器。当因超出作用域而删除了 EJB 容器的上下文 @Injected 实例时,并且如果应用程序对 remove 方法的直接调用尚未移除底层 EJB 容器,那么 WebSphere Application Server(传统) CDI 容器会移除有状态会话 bean。
产品 CDI 容器将在以下情况下移除有状态会话 bean:
- 当您使用 @Inject 方法创建上下文注入实例,并且 EJB 容器中的该实例已因超出作用域而删除时。
- 当应用程序对 remove 方法的直接调用尚未移除底层 EJB 容器时。
还必须考虑 CDI bean 的作用域和状态传播。请求和应用程序作用域 CDI bean 在其各自上下文中跨 Web 和 EJB 容器维护状态。 例如,当有状态会话企业 bean 上的业务方法访问相同请求作用域 bean 时,在 servlet 中注入的请求作用域 CDI bean 会保持其状态。