为啥会有不同的bean管理注解

Posted

技术标签:

【中文标题】为啥会有不同的bean管理注解【英文标题】:Why are there different bean management annotations为什么会有不同的bean管理注解 【发布时间】:2013-02-10 00:59:44 【问题描述】:

有什么区别

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

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

?

【问题讨论】:

【参考方案1】:

    javax.enterprise.context.SessionScoped(JSR 346) 和javax.enterprise.context.* 包下的所有其他注解都维护CDI 的上下文。 CDI 为 Java EE 空间内的依赖注入、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 特定的依赖注入和bean 管理机制。然而,使用 JSF 注释注释的 Bean 仅在 Web 层中有用。 JSF 注释可用的所有范围都已在 CDI 规范中复制。

    javax.annotation.ManagedBean (JSR 316) 和javax.annotation.* 下的其他与 DI 相关的注解是一种尝试将基于 JSF 的注解推广到 Java EE 规范中的其他用途,实际上不应该被最终开发者。

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

也请参阅这些相关问题:

JSF: Backing beans (@ManagedBean) or CDI Beans (@Named)? Java EE 6 @javax.annotation.ManagedBean vs. @javax.inject.Named vs. @javax.faces.ManagedBean

【讨论】:

精彩的答案。澄清了很多事情。

以上是关于为啥会有不同的bean管理注解的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# @Autowired注解到底怎么实现的?

Spring管理Bean(XML与注解方式)

Spring入门到进阶 - Spring Bean管理 注解方式

Bean管理(注解)和AOP

Spring的Bean管理(注解)四个相同功能的注解

IOC容器-Bean管理注解方式