2

我是 JavaEE 和 EJB 的新手。我用它做了我的前几个步骤,但有很多关于基本注释的东西,我不明白,不管我花多少时间在谷歌上搜索和阅读电子书。也许有人可以帮忙或向我推荐一个很好的解释。

@Stateful/@Stateless 我想我理解了基本概念。但是默认使用哪一个呢?

@ManagedBean/@Named @Named 注释是否与 @ManagedBean 相同,只是具有自定义名称?

@Sessionscoped/@Requestscoped 这些会干扰@Stateful/@Stateless 吗?在我的理解中,将@Stateless 与@Sessionscoped 配对是没有意义的,因为@Stateless bean 位于服务器上的这个“Bean-Pool”中,并且用于单方法调用而不是用于持久任务。基于这个逻辑,我认为拥有 @Requestscoped @Stateful bean 没有意义,因为在初始 HTTP-Request 之后,您的 Bean 与客户端“断开连接”。

我让我的程序正常工作,但是如果我做得很有效,如果我真的不知道自己在做什么,我现在怎么能这样做?

4

1 回答 1

5

AD 1. None 是“默认值”。必须将 EJB 声明为 EJB,您可以通过使用@Stateless@Stateful@Singleton、对其进行注释来做到这一点@MessageDriven

如果您没有它们中的任何一个,那么它就不是 EJB,因此无法定义“默认”值。

@ManagedBeanAD 2.事实上有两个: javax.faces 一个javax.annotation 一个

坦率地说,我不知道@ManagedBeanfromjavax.annotation真正使用在哪里。它声明 bean由容器管理,因此它的生命周期是受控的——但是是什么容器控制它呢我不知何故觉得它已经过时了,因为有@NamedEJBjavax.faces @ManagedBean的注释和 CDI 注释——它们都将它们的注释类定义为托管但明确定义了管理它们的容器。

@Named定义了一个可以在 JSF 视图(UEL 表达式)中使用的 CDI bean。@ManagedBean定义了一个 JSF 托管 bean。通常它们可以互换使用,但您应该注意一些差异,例如,@Named您使用的 bean 不能被注释为 JSF @ViewScoped,因为@ViewScoped只能应用于 JSF 托管 bean。

AD 3. 我认为您不应该将 CDI 范围与 EJB 范围混合使用。这是经常被混淆的东西,如果未来的 Java EE 解决这个问题,那就太好了。

EJB bean ( @Stateless/ @Stateful) 有自己的生命周期,CDI bean ( @SessionScoped, @RequestScoped) 有自己的生命周期。
我不确定通过混合这些注释你会得到什么 - 也许是一个例外,也许是一些黑魔法错误,或者它实际上可能按你想要的方式工作。
我猜它完全依赖于实现者,因为我不记得它在 EJB / CDI 规范中定义。我不会依赖它。

于 2012-09-26T14:01:00.837 回答