在 Java EE 6 中,各种托管 bean 之间存在一些重叠:JSF 托管 bean (@ManagedBean)、CDI 托管 bean (@Named) 和 EJB bean (@Stateless、@Statefull、@Singleton)。
在视图层中,我没有看到坚持使用@ManagedBean 的任何特殊优势。CDI 变体@Named 似乎能够做同样的事情甚至更多,例如为您提供对转换范围的访问。
目前的想法似乎是最终 EJB 组件模型也将被改造为一组 CDI 注释。尤其是专家组成员 Reza Rahman 经常暗示这一点。参见Java EE 6 中的依赖注入 - 第 1 部分
目前这还没有发生,所以 EJB bean 仍然是最容易放置业务逻辑的地方,尤其是当 JPA 用于持久性时。
尽管如此,无论 CDI 是否会获得 EJB 的功能,恕我直言,为“支持 bean”概念使用单独的 bean 并为“业务逻辑”使用单独的 bean 仍然是最佳实践。
支持 bean 可以非常苗条,只包含一些对模型对象和服务 (EJB) 的引用。支持 bean 的操作方法几乎可以直接委托给服务,但它们的附加价值在于为用户提供反馈(在成功或失败时添加 FacesMessages)和进行小的 UI 修改(例如,将布尔值设置为 false 以显示一些对话框) .
服务(业务逻辑)不应该对任何特定的表示一无所知。它们应该同样适用于 JSF 支持 bean、JAX-RS、Servlet、独立的 Java SE 远程客户端或其他任何东西。
即使所有 bean 都将成为 CDI bean,那么这也不会改变这种基本的职责分工。