@ManagedBeans是否因为CDI/WELD为@Named在Javaee6中是否过时?
-
05-10-2019 - |
题
由于CDI(及其实施焊接),JEE6中的每个pojo都可以注释 @Named
, ,这使Pojo可以访问视图。
这是否意味着托管现在已经完全过时了?还是我错过了一些地方 @ManagedBean
仍然有意义吗?
解决方案
简而言之, @ManagedBean
对于使用JSF但不使用JSR 299的应用程序(无论原因是什么)是有意义的。在加文·金(Gavin King)的更长解释下:
回复:与JSF2中的@managedBean注释进行比较?:
在查看焊接示例和较旧的韦伯人文档时,看起来像是新的@managedBean JSF 2.0注释的竞争对手。是否有任何信息何时要使用另一个信息?
这是一个很好的问题,我并不完全同意到目前为止发布的答案。
新的EE托管BEAN规范定义了Java EE的基本组件模型,以及一组非常基本的容器服务(
@Resource
,@PostConstruct
,@PreDestroy
).这个想法是,其他规格(以EJB,CDI,JSF和新的Java Interceptors规格开头)建立在此基础组件模型上,并层面其他服务,例如交易管理,类型AFT依赖性注入,拦截器。因此,在这个级别上,托管的豆类,CDI,拦截器和EJB规格都与之携带,并且具有高度互补的作用。
现在,关于确切确定哪些类是托管豆类的托管豆类规范。它确实提供了
@ManagedBean
注释是一种机制,但也允许其他规范定义不同的机制。因此,例如:
EJB规范说,一类使用某些编程限制的课程
@Stateless
或者@Stateful
EJB JAR中部署的注释是托管bean。CDI规范说,在“ Bean Deployment Archive”中部署的任何适当构造函数的类都是托管Bean。
鉴于EJB和CDI可以说明识别托管豆的更方便的方法,您可能会想知道什么
@ManagedBean
需要。正如Dan所指的那样,答案是,如果您在环境中有可用的CDI(例如,如果您使用的是EE6),则@ManagedBean
只是真的不需要。@ManagedBean
实际上是在没有CDI的JSF2的人使用的地方使用.OTOH,如果您确实注释了豆
@ManagedBean
, ,并且您确实在环境中有CDI,您仍然可以使用CDI将东西注入豆子。只是@ManagedBean
注释不是 必需的 在这种情况下。总结, 如果您确实可以使用CDI,它提供了一个 远的卓越的编程模型
@ManagedBean
/@ManagedProperty
JSF2从JSF1继承的模型. 。实际上,如此优越,以至于EE 6 Web个人资料不需要支持@ManagedProperty
等等。想法是您应该只是使用CDI。
其他提示
你有选择。要么使用JSF2的@ManagedBean将豆子绑定到您的表格中,要么使用CDI的@Named注释。如果您只打算执行JSF,则可以坚持@managedBean,但是如果您想与EJB集成,或者使用CDI的@conversationscoped,请使用CDI路由。
我个人认为下一个JSF的下一个版本应该贬低@managedBean,并以CDI为标准化。二元性使新来者感到困惑。
CDI没有视图范围,因为它 没有视图的概念, ,因此,如果您需要该范围,则其纯净形式的CDI将无法做到。查看范围基本上意味着 请求范围 +准备AJAX. 。它是 不是 JSF视图,就像一个名称的页面 xyz.xhtml
, ,即使您看到JSF <f:viewParam>
和喜欢的。经常带有视图豆的用例是 如何将参数获取到这样的豆子. 。还 读这个.
请注意,CDI宁愿生活在EJB/服务层,而不是JSF/演示层。 这个博客 有一个不错的概述。
像这样 @ManagedBean
如果您正在使用 @ViewScoped
豆 - 至少不是没有 扩展CDI 或使用 接缝3脸模块. 。当使用Ajax的JSF 2基于Richfaces,PrimeFaces,Icefaces等时,使用视图划分的豆几乎总是会发生。
从错误的Java EE 6包中混合注释 能够 使用RichFaces或类似API时,会出乎意料地遇到麻烦:
@javax.faces.bean.ManagedBean
@javax.faces.bean.[Jsf]Scoped
用于使用的组件 独自 在演示层,在这里,由Richfaces,PrimeFaces等。一些丰富的组件 似乎有CDI-NONTOTED和JSF注销的辅助豆豆有问题. 。如果您从豆(或似乎什么都不做的豆类)中获得奇怪的行为,那么注释的错误组合可能就是原因。
混合JSF和CDI
@javax.inject.Named
@javax.faces.bean.[Jsf]Scoped
在JSF页面引用时,在大多数情况下都是可能的,但是有一些鲜为人知的问题/缺点,例如 使用CDI没有的JSF范围:
也是组合
@Named @ViewScoped
无法按预期工作。 JSF特定的@ViewScoped
与JSF特异性的结合作品@ManagedBean
只要。您的CDI特定@Named
会表现得像@RequestScoped
这边走。两种用法@ManagedBean
代替@Named
或使用CDI特异性@ConversationScoped
代替@ViewScoped
.
然后
@javax.inject.Named
@javax.faces.bean.[Cdi]Scoped
可用于直接从JSF页面AFAIK引用的CDI豆。到目前为止,我对上述组合还没有任何问题,因此您可以考虑 @ManagedBean
在这里过时。
剩下的是服务层,这里主要是交易ejb服务bean被宣布为
@javax.ejb.*
主要是 @javax.ejb.stateless。您甚至可以注释和使用 EJB直接来自JSF页面 - 尽管我不确定这种设计是否理想。引用(注入) @javax.ejb。*,例如*,例如 @Stateless
, , 更喜欢 @Inject
超过 @EJB
如下所述. 。 (可能是这个答案的祖先...)
最后,可以在这里找到一个非常好的Java EE 6注释的概述:http://www.physics.usyd.edu.au/~rennie/javaeereferencesheet.html
笔记: :以上信息不是来自专家,而是从新移民的角度来看我自己的看法 令人困惑的Java EE 6注释意大利面条. 。更多的见识尚未开发。我希望这个答案能够忍受成为这种混乱的一般性,实用的答案 - 即使它在原始问题的背景下已经有些过分了。
当我刚刚读到 焊接参考 (p。12),@managedBean现在是过多的:
您可以通过注释bean class @managedBean来明确声明托管的bean,但是在CDI中,您不需要。根据规范,CDI容器将满足以下条件作为托管bean的任何类别视为:
- 它不是非静态内部类。它是一个具体的类,或者是注释@decorator。
- 它没有用EJB组件定义注释来注释,也没有在ejb-jar.xml中声明为EJB bean类。
- 它不会实现javax.enterprise.inject.spi.extension。
- 它具有适当的构造函数 -
- 该类有一个没有参数的构造函数,或
- 该类声明一个构造函数注释@Inject。