2012-09-26 60 views
2

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

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

@ ManagedBean/@命名为 @Named Annotaion与@ManagedBean相同,只是使用自定义名称?

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

我得到我的程序工作,但我怎么现在如果我做到了高效率,如果我实际上不知道我在做什么?

回答

5

AD 1.无“默认”。一个EJB必须被声明为一个EJB,你可以用@Stateless,@Stateful,@Singleton,@MessageDriven来注释它。

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

AD 2.其实有此事2 @ManagedBeanjavax.faces onejavax.annotation one

坦率地说,我不知道从哪里javax.annotation@ManagedBean真的使用。它声明这个bean是由容器管理的,所以它的生命周期是受控的 - 但是什么容器控制它呢?我以某种方式感觉它已经过时了,因为有@Named,javax.faces @ManagedBean,EJB的注释和CDI注释 - 它们都将它们的注释类定义为管理的,但明确定义了管理它们的容器。

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

AD 3.我认为您不应该将CDI范围与EJB范围混合。这是经常困惑的事情,如果未来的Java EE解决了这个问题,那将会很好。

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

+0

谢谢,这真的清除了事情! 我一直认为这一定很容易,但不知何故,我必须重读这些注释是如何相互关联的。 – fancy

+0

很高兴我可以帮助你:-)嗯,如果你刚开始使用Java EE,我发现那些东西真的搞砸了,我真的希望未来的Java EE能够解决这些问题(比如范围)。例如。可能有一个CDI坐在核心位置,所有其他容器都使用特定的构造型,比如EJB只是一个具有'@ RequestScoped','@ Transactional'的CDI。然而,有时候很难为简单的问题得到答案:-)干杯! –