我最近获得了一个涉及编写Web应用程序的项目。我以前从未做过Java EE。网络上的大量资源都已过时,我无法确定各种标准与Java技术之间的当前差异。
最初我认为由于依赖注入,JPA,会话管理和Web服务,我确实需要EJB 3.1。我开始尝试使用Glassfish,但被告知我们必须在Tomcat中编写这个东西。所以我一直在试图弄清楚我需要什么,以及什么以及如何放入Tomcat到达那里。我开始质疑我是否甚至需要EJB。
我想将JFS用于MVC架构。在了解这一点时,我遇到了ManagedBeans和CDI,根据一些人的说法,前者已经过时,而且似乎也提供了我想要启用单元测试的所有依赖注入内容。我也开始意识到我可以以Hibernate的形式在EJB之外获得JPA,也许还有其他一些。此外,似乎我不知道我需要的Web服务是以另一种标准的形式出现,我现在无法想到这个名称,这也可以独立安装。
我的主要问题是会话管理和状态。在我看来,剩下的所有剩下的就是提供@Stateless / @ Stateful和@ Local / @ Remote。但是,据我所知,其中一些已经以servlet容器中的会话管理的形式存在......但我不知道为了决定我需要考虑多少或哪些主要差异如果我需要这些东西。
所以我的问题是,为了确定EJB是否值得关注,或者我是否有足够的其他库和技术形式,我需要了解哪些基本的,本质的差异?我一直在google和Usenet,但无法在任何地方找到这些信息。
想到了另一点。据我所知,@ Stateful bean注释为我提供了线程安全状态保存。我可能不会直接使用线程,但我知道Java在幕后做了很多,并且特别怀疑EE。当我需要保持状态时,如果已经提供了线程,我不想处理线程。
答案 0 :(得分:3)
<强> ManagedBean 强>
Java EE 6有三种不同的方式以某种方式定义 beans
managed
:
<强> @javax.faces.bean.ManagedBean
强>
JSF 2.0引入了这个注释,在faces-config.xml中声明了托管bean。此注释用于从表达式语言访问bean。
<强> @javax.inject.Named
强>
在EE 6容器CDI中,这个注释是一个内置的限定符类型,用于为bean提供名称,使其可以通过EL访问。
<强> @javax.annotation.ManagedBean
强>
此批注试图将JSF托管bean概括为在Java EE中的其他位置使用。
如果部署在EE 6容器中(如果使用Tomcat或其他servlet容器,也可以通过将Weld jar添加到Web应用程序来获取CDI),那么实际上没有理由使用@javax.faces.bean.ManagedBean
。只需使用@javax.inject.Named
并开始利用CDI服务。
<强> CDI 强>
CDI规范的目标之一是将Web层和事务服务结合在一起,使开发人员可以轻松地在Java EE平台的Web应用程序中使用EJB和JSF。
使用CDI,您可以获得以下服务:明确定义的生命周期contexts
(受接缝2和会话范围影响),Dependency injection
,松散耦合设施,如interceptors,decorators和events以及可移植扩展,它允许第三方框架集成到Java EE 6环境中,如SEAM 3 extensions
托管bean和EJB服务
首先,CDI适用于任何托管bean。一些托管bean是EJB。当我们需要在托管bean中使用EJB服务时,我们只需添加@Stateless
,@Stateful
或@Singleton
注释。 IMO作为补充技术,只需添加一些注释即可实现灵活,渐进的开发。
那么,何时应该使用会话bean而不是普通的托管bean?
当您需要一些缺少CDI的EJB功能时:声明式事务,并发管理,池,远程或Web服务调用,定时器和异步方法调用。
当然,您也可以使用第三方库获得所有方面 - 但这会给您的项目带来额外的复杂性。在功能方面,IMHO EJB是实施的地方:
最后,如果您需要EJB服务,那么您需要一个应用服务器(例如GlassFish或Jboss AS),如果您只需要CDI服务,则需要一个Servlet容器(例如Tomcat)和CDI库。
答案 1 :(得分:1)
您是否需要EJB提供的功能,即安全性和事务管理?如果答案是肯定的,那么EJB可能是一个不错的选择。 如果答案是否定的,并且您只需要依赖注入,则CDI可能是一个不错的选择。 您还可以获得与其他第三方产品类似的功能,例如Spring(依赖注入,Spring安全性等),但决定您是使用一个(EJB)还是另一个(例如Spring)在许多情况下都是以前的问题技能。
在我看来,如果没有先前的限制,那么遵守Java规范是一项很好的投资。
答案 2 :(得分:1)
我建议你从CDI开始,然后继续使用EJB(它真的在POJO之上添加一个注释),如果需求需要它们(就像它被告知的那样 - 事务性,Web服务,JMX,定时器) ,EJB异步调用)。
开发一个应用程序是非常合理的,在该应用程序中,您的入口点是一个EJB,它包含您在事务中的调用,并允许您定义多个入口点。然后EJB调用其中包含业务逻辑的CDI bean。
值得注意的是,TomEE是在Apache Tomcat之上开发的经认证的Java EE 6 Web Profile。