有什么区别
import javax.annotation.ManagedBean;
import javax.enterprise.context.SessionScoped;
和
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
?
请您参考如下方法:
javax.enterprise.context.SessionScoped
( JSR 346 ) 以及javax.enterprise.context.*
包下的所有其他注释都维护 CDI 的上下文。 。 CDI 为 Java EE 空间内的依赖注入(inject)、bean 和通用资源管理提供了一种替代的、通用的、更强大的机制。它是 JSF 托管 bean 的替代方案,甚至将取代 coming version of 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 只能存在于完整的应用程序服务器中。与some legwork但是,Tomcat 7 可以连接以支持 CDI。
具体来说,
javax.enterprise.context.SessionScoped
是 CDI 内 JSF Session Scope 的并行实现。javax.faces.bean.SessionScoped
( JSR 314 ) 和javax.faces.bean.*
包下的所有其他注释维护 JSF 特定的依赖项注入(inject)和 Bean 管理机制。然而,使用 JSF 注释进行注释的 Bean 仅在 Web 层中有用。 JSF 注释可用的所有范围都已在 CDI 规范中复制。javax.annotation.ManagedBean
( JSR 316 ) 和javax.annotation.*
下的其他 DI 相关注释是试图将基于 JSF 的注释概括为 Java EE 规范中的其他用途,最终开发人员确实不应该使用。
它们为何存在?在我看来,从 JSF beans 到 CDI beans 的转变是该技术的自然演变。 JSF bean 运行良好,但 Spring、Guice 和 Seam 等产品显然表明该技术还不够。还需要弥合 Web 组件和 EJB 之间的差距,而满足该需求的就是 CDI。
另请参阅这些相关问题: