2011-11-11 32 views
0

我想在需要时使用普通的旧Java对象(PO​​JO)和常规类文件,并且只在需要它们添加的功能时才使用EJB,例如异步调用,池化等。我想知道服务器在项目部署在服务器上时会处理此行为。由于它不是由容器管理,因此每个无状态会话Bean都可以创建一个新的实例,可以调用它的一个方法?静态方法或状态等事情如何影响这个模型。Web服务器/容器如何对待EJB和实体等其他类的POJO?

编辑:

1)我可以澄清更多。 Java EE的意义在于你用@stateless等注释一个POJO,以便容器可以管理它。你不必声明一个你刚刚注入的无状态bean的新实例,并且可以调用它的类型。

2)大多数Java EE教程和书籍从未提及未注释的类作为业务逻辑的一部分。它从来没有提出。这对我来说似乎很奇怪,如果你可以在你的业务逻辑的Java EE项目中使用它们,并且它可以在服务器上部署。如果您不需要池化或异步访问 - 容器通过EJB帮助管理员的事情,那么您可以在Java EE项目中使用这些常规POJO。

3)这导致我的问题是我如何正确地纳入项目?我是否将它们放入与EAR连接的EJB项目中,还是放入EAR中?或动态网页项目。几乎没有提及或指导正确使用这种常规物体。当它被编译成WAR进行部署时,是否有任何问题在服务器上遇到?它不是期待正确注释的EJB,servlet或JSP吗?

+0

您将需要提供更多详细信息。你的问题非常模糊和混乱。 – jtahlborn

+0

这是模糊的问题,因为我期待一个模糊的答案。我正在寻找正确使用未注释并因此由java服务器容器管理的常规java对象。这对我很重要,因为我有一个项目,我认为该类不需要成为EJB,但是在我的所有书籍中,以及我在线阅读的内容中,他们从未涉及非EJB业务逻辑。 – Randnum

回答

2

根本不影响它。类是类,对象是对象。他们没有管理,他们不受干扰,他们没有任何反应。他们不是特别的。

静态单例是静态单例,Java是java。

所有你需要知道的是你的容器的classloader布局,以及它如何与你部署的应用程序和资源相关联。 (例如,一个应用程序中的类无法在其他应用程序中看到类)。大多数情况下,这并不重要。有时候,事情变得更加复杂。

但大多数情况下,它只是Java。

附录:

一种更好的方式来看待这个是简单地组你的类起来局部性的块。

让我们来看一个简单的使用EJB的Web应用程序。

Web应用程序部署在WAR工件中,EJB可以单独部署,作为容器中的单个EJB部署,或者更可能在EAR中部署。将应用程序打包到EAR中时,您可能也会将WAR捆绑到EAR中。因此,最终EAR包含您的WAR和您的EJB。

现在在开发过程中,在这种情况下,您将有三类中的一类。

  1. 仅与EJB相关的类(例如会话Bean)。

  2. 仅与WAR相关的类(例如Servlet类)。

  3. 与两者(也许是数据库实体)相关的类。

因此,一个简单的打包方法是在三个jar文件中。 WAR的jar文件(实际上,这是WAR,包含WEB-INF/classes中的类),EJB文件的jar文件以及第三种类型的jar文件,我们称之为库。

就构建依赖性而言,WAR构建依赖于lib,而EJB构建依赖于lib。但是WAR和EJB都不依赖于对方,因为它们不直接共享任何内容,只是间接通过第三个库jar分享。 lib jar是独立的,因为它不依赖于WAR或EJB。请注意,您的EJB会话Bean接口类将进入库jar(因为两个层都依赖它们)。

在您的耳边,您只需将lib jar,WAR和EJB jar以及META-INF目录和application.xml文件捆绑在一起。 WAR有它自己的结构,使用WEB-INF和所有EJB jar都有它的META-INF和ejb-jar.xml。但值得注意的是,lib.jar不在WEB-INF/lib目录中,它位于EAR包中,因此由EJB和WAR使用容器负责的类加载器欺骗来共享。

这一点很重要。例如,如果你的lib jar中有一个简单的静态Singleton,那么WAR和EJB将共享这个Singleton,因为它们都是同一个类加载器的一部分。要使用这个Singleton,这只是普通的Java。没有什么特别的。

如果EJB和WAR单独部署,他们将需要有自己的lib.jar副本,并且在Singleton的情况下,他们不会共享它,因为每个模块都有自己的类加载器。

因此,除了一些真正的燃烧需要,否则将所有内容绑定到EAR并将EJB层和WAR层同时视为单个集成应用程序更为容易。

附录2:

的人就不多谈Java EE开发利用类,因为没有什么可谈的,他们只是使用它们,就像在任何Java程序。你在这里想这个。这3个jar成语:war,ejb,lib是我多年来使用的一个,因为它分离了3个关注点,并限制了依赖关系。客户端 - > lib - > EJB。它还简化了构建,因为客户端通常只需要lib jar和java。在Netbeans IDE中,这是微不足道的管理。通过小的工作,在其他IDE或甚至ant/maven中都很简单。这不是一个巨大的负担,但保持三个部分相对干净。

依赖和Jar管理是任何大型Java项目的噩梦,对于EJB来说,当您处理不同的可部署工件时更是如此。在我的书中,任何可以帮助缓解这种情况都是一种胜利,事实是,一个干净独立的lib jar有很多帮助,特别是需要将该lib与其他代码集成和使用。例如,如果稍后使用远程EJB或甚至Web服务编写外部GUI客户端,则lib jar是客户端唯一的依赖项。这个罐子的好处远远超过建立这种类型库的轻微痛苦。

最后,lib jar就像您希望在应用程序中使用的任何其他jar一样(比如日志记录或任​​何其他流行的第三方jar)。

+0

好吧,我想我只是混淆了自己,因为我正在接受“EJB的商业逻辑”学校的培训,并且没有提到您可以轻松使用常规Java类,而无需注释逻辑。这样就清除了它。我不知道为什么我的问题被拒绝投票,我只是想更好地理解JEE。一旦人们有机会考虑我的新评论,我会尽快接受这个答案。谢谢 – Randnum

+0

所以你说的是,大多数人没有提到正常的java类作为JEE web开发的一部分的原因是因为他们比单纯使用EJB更多的工作?既然你必须将它们包含在单独的jar库文件中,而EJB只是与正常的war/ear部署捆绑在一起呢? – Randnum

+0

难道我不能只把它们放到他的EJB项目中,然后他们会正常部署? – Randnum

相关问题