42

和有什么区别

import javax.annotation.ManagedBean;
import javax.enterprise.context.SessionScoped;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

?

4

1 回答 1

55
  1. javax.enterprise.context.SessionScoped( JSR 346 ) 和包下的所有其他注释javax.enterprise.context.*维护CDI的上下文。CDI 为 Java EE 空间内的依赖注入、bean 和通用资源管理提供了一种替代的、通用的和更强大的机制。它是 JSF 托管 bean 的替代方案,甚至将在即将到来的 JSF 版本中取代 JSF bean 管理机制。

    目前,JSF 和 CDI 注释 bean 在任何给定的 Java EE Web 应用程序中都是可互换的(考虑到一些小的限制)。然而,CDI 注释 bean 远远超出了 Web 层的范围,这就是 Java EE 规范不断发展以使 CDI 成为标准 bean 和 DI 机制的原因。

    虽然 CDI 可能是所有 Java EE 开发的明显选择,但 JSF 托管 bean 可跨 servlet 容器 (Tomcat) 和应用程序服务器(Glassfish、JBoss 等)移植。CDI bean 只能存在于完整的应用程序服务器中。然而,通过一些工作,Tomcat 7 可以连接以支持 CDI。

    具体来说,javax.enterprise.context.SessionScoped是 CDI 中 JSF Session Scope 的并行实现。

  2. javax.faces.bean.SessionScoped( JSR 314 ) 和包下的所有其他注解都javax.faces.bean.*维护 JSF 特定的依赖注入和 bean 管理机制。然而,使用 JSF 注释注释的 Bean 仅在 Web 层中有用。JSF 注释可用的所有范围都已在 CDI 规范中复制。

  3. javax.annotation.ManagedBean( JSR 316 ) 和其他与 DI 相关的注释javax.annotation.*是试图将基于 JSF 的注释概括为 Java EE 规范中的其他用途,最终开发人员实际上不应该使用这些注释。

它们为什么存在?好吧,IMO,从 JSF bean 到 CDI bean 的转变是该技术的自然演变。JSF bean 运行良好,但 Spring、Guice 和 Seam 之类的技术明显表明该技术还不够。还需要弥合 Web 组件和 EJB 之间的差距,而 CDI 就是对这种需求的回应。

也请参阅这些相关问题:

于 2013-02-25T00:06:46.807 回答