Jsf 在JavaEE6中@ManagedBeans是否因为CDI/Weld中的@Named而过时?
由于CDI(及其实现),JEE6中的每个POJO都可以用Jsf 在JavaEE6中@ManagedBeans是否因为CDI/Weld中的@Named而过时?,jsf,jakarta-ee,jsf-2,jboss-weld,Jsf,Jakarta Ee,Jsf 2,Jboss Weld,由于CDI(及其实现),JEE6中的每个POJO都可以用@Named注释,这使得POJO可以访问视图 这是否意味着ManagedBeans现在已经完全过时了? 还是我错过了一些@ManagedBean仍然有意义的地方?正如我刚才在(第12页)中读到的,@ManagedBean现在是超级棒: 您可以显式声明托管 通过注释bean类来创建bean @ManagedBean,但在CDI中您没有 需要。根据 规范,CDI容器 处理满足以下条件的任何类: 以下条件作为托管 豆子: 它不是一个非静态的内部
@Named
注释,这使得POJO可以访问视图
这是否意味着ManagedBeans现在已经完全过时了?
还是我错过了一些@ManagedBean
仍然有意义的地方?正如我刚才在(第12页)中读到的,@ManagedBean现在是超级棒:
您可以显式声明托管
通过注释bean类来创建bean
@ManagedBean,但在CDI中您没有
需要。根据
规范,CDI容器
处理满足以下条件的任何类:
以下条件作为托管
豆子:
- 它不是一个非静态的内部类。它是一个具体的类,或者是 注释@Decorator
- 它没有使用定义注释或注释的EJB组件进行注释 在中声明为EJB bean类 ejb-jar.xml
- 它没有实现javax.enterprise.inject.spi.Extension
- 它有一个合适的构造函数:
- 该类有一个没有参数的构造函数,或者
- 该类声明了一个带注释的@Inject构造函数
你有选择的余地。使用JSF2中的@ManagedBean将bean绑定到表单中,或者使用CDI中的@Named注释。如果您计划只使用JSF,那么可以使用@ManagedBean,但是如果您想与EJB集成,或者使用CDI的@ConversationScope,那么就使用CDI路线
我个人认为JSF的下一个版本应该反对@ManagedBean,并在CDI上进行标准化。这种二元性让新手感到困惑。简而言之,
@ManagedBean
对于使用JSF但不使用JSR 299的应用程序来说是有意义的(无论原因是什么)。下面是加文·金的详细解释:
:
在浏览焊接示例和旧的WebBeans时
文档,它看起来像一个
新@ManagedBean JSF的竞争对手
2.0注释。有没有关于我们什么时候使用的信息
一个在另一个之上
这是个好问题,我不是
真的完全同意
到目前为止已经发布的答案
新的EE管理bean规范
定义的基本组件模型
JavaEE,以及一个非常基本的
容器服务集(@Resource
,,
@PostConstruct
,@PreDestroy
)
我们的想法是,其他规范
(从EJB、CDI、JSF和
新的Java拦截器规范)基于
此基础组件模型和层
例如,其他服务
事务管理,类型安全
依赖注入,拦截器。所以
在这个级别上,托管bean、CDI、,
拦截器和EJB规范
所有的工作都是手拉手的,而且都是高度一致的
补充
现在,托管bean规范
在这方面是非常开放的
确定哪些类是
管理豆。它确实提供了
@ManagedBean
注释为一体
机制,但它也允许其他
规范定义不同的
机制。例如:
- EJB规范指出,一个类遵循特定的编程规则
无状态的限制或
注释部署在 ejbjar是一个托管bean@Stateful
- CDI规范指出,任何具有适当构造函数的类 在“bean部署”中部署 “归档”是一个托管bean
@ManagedBean
到底是什么
需要。答案,正如暗指的那样
丹,如果你有CDI的话
在您的环境中可用(用于
例如,如果您使用的是EE6),那么
@ManagedBean
并不是真正的
需要@ManagedBean
确实存在
供使用JSF2的用户使用
没有CDI
OTOH,如果你对一个bean进行注释
@ManagedBean
,您在
在您的环境中,您仍然可以使用
CDI将东西注入你的豆子。
只是@ManagedBean
此文档中不需要注释
案例
总之,如果你有CDI
对您可用,它提供了一个
高级编程模型
@ManagedBean
/@ManagedProperty
模型
JSF2从JSF1继承而来。所以
事实上,EE6网络的优势在于
配置文件不需要对的支持
@ManagedProperty
等。这个想法
你应该用CDI来代替
CDI没有视图作用域,因为它是,所以如果您需要该作用域,纯形式的CDI无法做到这一点。视图范围基本上是指。它不是一个JSF视图,就像一个名为
xyz.xhtml
的页面,尽管您看到的是JSF
等等。视图范围bean的一个常见用例是。还有
请注意,CDI位于EJB/服务层,而不是JSF/表示层。有一个很好的概述
因此,如果您使用的是@ViewScoped
bean,则不能完全用CDI替换@ManagedBean
,至少不能不使用或使用。当使用基于AjaxedJSF2的GUI工具包(如RichFaces、PrimeFaces、IceFaces等)时,几乎总是会使用视图范围的bean
在使用RichFaces或类似API时,混合使用错误Java EE 6包的注释可能会让您意外地陷入麻烦:
@javax.faces.bean.ManagedBean
@javax.faces.bean.[Jsf]Scoped
用于表示层中单独使用的组件,这里由RichFaces、PrimeFaces等使用。一些rich组件。如果您的bean(或者看起来什么都不做的bean)出现了奇怪的行为,那么注释的错误组合可能是原因
混合JSF和CDI,比如
@javax.inject.Named
@javax.faces.bean.[Jsf]Scoped
在大多数情况下,当从JSF页面引用时,这是可能的,并且是有效的,但是
@javax.inject.Named
@javax.faces.bean.[Cdi]Scoped
@javax.ejb.*