【问题标题】:What exactly is a container in J2EE and how does it help?J2EE 中的容器到底是什么,它有什么帮助?
【发布时间】:2011-11-21 11:01:04
【问题描述】:

我现在正在阅读 J2EE 1.4 规范,有很多术语我不明白做什么。 这是来自容器的规格:

容器为 J2EE 应用程序组件提供运行时支持。 容器为应用程序提供底层 J2EE API 的联合视图 组件。 J2EE 应用程序组件从不直接与其他 J2EE 交互 应用程序组件。他们使用容器的协议和方法 彼此交互并与平台服务交互。插入容器 在应用程序组件和 J2EE 服务之间允许容器 透明地注入组件部署定义的服务 描述符,例如声明性事务管理、安全检查、资源 池化和状态管理。

由于我来自 Web 开发世界,我无法理解,这究竟是做什么的以及容器的用途是什么。提供运行时支持是什么意思?它如何使 J2EE 在可扩展性、架构方面成为更好的系统?

【问题讨论】:

  • “它如何使 J2EE 在可扩展性、架构方面成为更好的系统?” - 关键点,比什么更好?除了 JEE 的“企业方式”之外,还有其他 Java Web 开发方法值得考虑。
  • @Lokling 那么 JEE 到底有什么用处,它是为基础设施服务构建的。来自 web 开发背景,我觉得很多 JEE 可以以更好的方式完成 web 开发。我不知道 JEE 可能处理得很好也可能处理得不好的中间件或基础设施需求。
  • @gizok -- 最简单的情况是它尝试“关注点分离”,应用程序代码处理业务逻辑,容器处理技术内容。早期的实现存在缺陷这一事实并不意味着它是一个坏主意。

标签: java jakarta-ee


【解决方案1】:

J2EE/Java EE 应用程序不是自包含的。为了被执行,它们需要被部署在一个容器中。换句话说,容器在 JVM 之上提供了一个执行环境。

此外,应用程序依赖于几个 API,如 JPA、EJB、servlet、JMS、JNDI 等。符合 EE 的容器的作用是提供所有或部分这些 API 的标准实现。这意味着您理论上可以在任何容器之上运行您的应用程序,只要它依赖于标准 API。

从技术角度来看,容器只是另一个带有main() 方法的 Java SE 应用程序。另一方面,EE 应用程序是服务/bean/servlet/等的集合。容器找到这些组件并运行它们,提供 API 实现、监控、可扩展性、可靠性等。

【讨论】:

  • 让我正确理解这一点,容器就像针对特定于 J2EE 的 JVM 上的运行时环境。如果是这样的话,这种层分离会影响性能吗?请原谅我对 Java 或 J2ee 的了解不多
  • @gizgok:它可能会引入一些开销,但不一定(请参阅我的更新)。
  • 应用程序不是自包含的是什么意思,是不是因为我们采用了 n 层架构,所以 jee 应用程序不或者更确切地说不喜欢在 web 服务器上运行而不是在 j2ee 服务器上运行。
  • @gizgok Java SE 应用程序是自包含的,因为您只需要一个带有应用程序的 JAR 即可运行(当然还有 JRE)。另一方面,对于 Java EE,一个 servlet、单独的 EJB 或 MDB 是没有用的。您需要一个容器来实际运行它们、管理它们的生命周期并调用它们。例如。单独的 servlet 只是一个 Java 类,即使没有 main()。但是一旦部署到 web 容器上,容器会自动调用每个 HTTP 请求。容器实现 HTTP。当然你可以在 Java SE 中自己实现 HTTP 服务器——但是容器会为你做这些,你可以专注于业务逻辑。
  • @TomaszNurkiewicz 我想理想的做法是专注于业务逻辑,但是自从我开始使用 J2EE 以来,我不得不花更多的时间来弄清楚如何简单地配置容器以提供数据源并执行我的代码。人们将在未来的框架/语言中发明更简单的做事方式(例如,比较如何在 J2EE 中使用 XML 映射 servlet 与如何在 Express.js 中使用纯 JavaScript 调用设置 REST 映射)。前者是一个黑匣子,而后者很明显可以从哪里找出它在引擎盖下所做的事情。
【解决方案2】:

JEE 容器为您的源代码提供了一个包装器。

典型的容器是经典的 EJB 数据 bean,以及消息驱动的 bean。 servlet和portlet在一定程度上也可以看作是容器。

容器提供的大量服务是什么:-

  • 调用 -- 您的代码会在需要时加载并启动。
  • 事务上下文 -- 大多数容器代码出现在 ACID 事务上下文中。
  • 配置 -- 诸如 JDBC 连接之类的东西由容器传递给您。
  • 安全性 -- 容器将限制授权用户访问您的代码和数据。
  • 可扩展性——由于容器负责调度,因此它可以在负载变重时自动启动额外的副本,或者可以静态配置为并行运行多个实例。
  • 封装。您的程序向容器公开了一个接口。但是,它可能会在外部以各种形式(Corba、WSDL、JSM 等)公开此接口。
  • 公共服务。例如日志记录、其他 EJB 公开的服务。等等。

【讨论】:

  • Servlet 是根据 J2ee 规范的 Web 容器的一部分。这告诉我它提供的服务,而不是它为什么存在
  • @gizok -- 容器的存在是为了提供这些服务,因此,您无需对它们进行编码。目的有两个。一种为应用程序提供一致的 API 并保护它们免受安全和配置问题的影响。两个使大规模应用程序在部署、调度和访问控制方面易于管理,所有这些都由 JE 服务器以一致的方式管理。
【解决方案3】:

通常一个 Java 应用程序使用一个 JVM,并且每个应用程序都有一个操作系统级进程。容器允许多个 Java 应用程序在一个 JVM 下运行。

【讨论】:

    【解决方案4】:

    提供运行时支持是什么意思?

    您来自网络开发领域,这意味着您知道为网络开发的传统应用程序必须可以通过 HTTP 协议访问。 Java 是一种按设计在 JVM 上运行的编程语言。

    那么如何将 HTTP 请求链接到您的 Java 代码?

    必须做点什么。像 Apache 这样的 HTTP 服务器可以做到这一点,并且使用老式的通用网关接口 (CGI),您可以在 Apache 服务器收到 HTTP 请求时调用您的 Java 代码。

    这很好,但在某些时候网络应用程序需要身份验证 - 可以为此编写代码,网络应用程序需要一些数据库访问权限 - 也可以编写代码,网络应用程序需要一些 UI 代码也可以用MVC等写。

    此 Web 应用程序具有其他 Web 应用程序肯定会具有的需求,并且可以看到共同需求:身份验证、数据源(如 DB 等)等。
    正如之前的答案所提到的,Java 已经有很多这些作为 API 的需求,那么为什么不将所有这些知识和常见的重用要求放入可以在运行时支持 Web 应用程序的东西中:JEE 容器。

    它如何使 JEE 在可扩展性、架构方面成为更好的系统?

    我认为问题是,为什么 JEE 是一个比使用 CGI 的简单 HTTP 服务器更具可扩展性的系统?

    这个已经有人回答过了,但是我之前的回答相信就更清楚了。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-04-30
      • 2011-04-18
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      相关资源
      最近更新 更多