为什么有不同的bean管理注释

Kor*_*gay 38 jsf cdi managed-bean

有什么区别

import javax.annotation.ManagedBean;
import javax.enterprise.context.SessionScoped;
Run Code Online (Sandbox Code Playgroud)

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
Run Code Online (Sandbox Code Playgroud)

kol*_*sus 48

  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会话范围的并行实现.

  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.

请参阅以下相关问题:

  • 很棒的答案。澄清了很多事情。 (2认同)