Java EE - 谁实现了这个规范?

10

我有一些核心Java和Java EE的经验。我阅读了关于什么是Java EE的各种问题,并在SO上查看了一些答案:what-exactly-is-java-eewhat-is-java-ee

我有一些疑问:

1)如果Java EE只是一个规范,那么谁来实现它?应用服务器(如JBOSS、GlassFish)是否实现这些规范?

2)如果我没记错的话,EJB规范是由EJB容器实现的,而我相信EJB容器是应用服务器的一部分。那么,当我们作为开发人员编写EJB代码时,我们到底在做什么?我有疑问的是,EJB容器实现了EJB规范,那么我们是不是要覆盖EJB的某个“规范部分”?为什么EJB的某些部分由EJB容器实现,而开发人员编写其他部分?还是说EJB的某些部分必须由EJB容器提供,而某些部分必须由开发人员开发?我很难理解。

请问有人能帮助我理解这个问题吗?


2
  1. 已经在重复问题中得到了回答。
  2. 我们作为Java EE开发人员,只是Java EE API的最终用户。
- BalusC
5个回答

11

任何人都可以实现Java EE规范(JSR342),或其中任何一个JSR。当他们这样做时,他们可以(在购买并通过兼容性测试套件后)声称与该规范兼容。有许多供应商提供的应用服务器是与Java EE兼容的,但没有一个供应商实现完整的Java EE规范。例如,Java EE参考实现——Glassfish使用了Red Hat的CDI实现。有时,供应商不会实现Java EE规范的任何部分,他们会获取Glassfish,添加其供应商特定的库,并以其名称发布。为了声称兼容性,他们仍然需要经过认证流程并运行CTS。

寻找实现规范的所有供应商并不容易,因为并非所有供应商都会经过认证流程。例如,Apache CXF 并没有单独获得认证,而是作为 Red Hat 的 JBoss 的一部分获得认证。
每个规范都有一个 API 和一份书面 PDF,两者都定义了每个实现的强制行为。这就是编写 EJB 代码时使用的内容。例如,当您创建一个 EJB 时:
import javax.ejb.Singleton;
@Singleton
public class MySingleton{
   ... 
}

@Singleton注解是规范的一部分,但MySingleton类是您的EJB代码,它不是规范的一部分。然后EJB容器知道如何处理这个类。


非常感谢您的评论,很有道理。 - CuriousMind

2
在Java规范(Java EE、JSF、其他JSR)的情况下,通常在起草规范时会创建一个参考实现(Java EE的情况下为Glassfish),然后其他提供商可能会创建自己的规范实现(通常声称某种方式更好)。作为开发人员,您编写的代码可以使用规范提供的功能,在任何兼容的实现上都可以正确运行。请注意保留HTML标签。

1
是的,EJB容器(应用服务器)供应商如RedHat在其产品中实现J2EE规范(例如JBoss)。
他们不会实现任何业务逻辑(只有“管道”)。这就是应用程序开发人员的工作所在。
就像Apache HTTPD或nginx实现HTTP协议规范一样,但这并不能成为一个网站。

1
任何人都可以实现J2EE规范,尽管我不建议您自己尝试。您是正确的,通常由应用服务器实现,以便您可以在符合J2EE规范的容器上运行应用程序。还有开源库,将其与Tomcat结合使用即可实现规范(例如,请参见tomee)。当您编写应用程序时,您正在利用J2EE环境的好处,这将使您能够编写复杂的应用程序并专注于特定要求的需求。

1

1) 应用服务器实现规范,并在发布服务器时提供其实现细节。请参考 链接,其中指定了由JBOSS 7实现的各种JSR。

2) 当我们仅使用应用程序服务器提供的任何实现时,实例将从服务器提供的实现中获取。而如果我们已覆盖类,则我们的覆盖类将提供我们的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接