为什么 servlet 容器不优于 spring IOC 容器?

Why servlet container not preferred over spring IOC container?

Servlet容器实现了JavaEE规范的web组件契约,为web组件指定了一个运行环境,包括安全、并发、lifecycle management、事务、部署等服务。

Apache tomcat 是一个开源示例。

每个 Web 应用程序都使用满足 javax.servlet.ServletContext 给定合同的对象


Spring IOC 容器还实现了 Java EE 规范的 Web 组件契约。

每个 Web 应用程序都使用满足 org.springframework.context.ApplicationContext 给定合同的对象


为什么 Spring IOC 容器优于 servlet 容器?

这个问题中有很多有问题的陈述,我会尽力通过添加一些希望有所帮助的 "list" 事实来澄清一些事情:

  1. Tomcat 没有实现 JEE 规范,事实上,它仅以在 JEE 的保护伞下实现小型(尽管重要且广泛使用)规范而闻名:servlets(和 JSPs,它在技术上是一个 servlet,但形式更 HTML)。
  2. 确实 tomcat 也遵循 JEE 中描述的 WAR 部署模型,但在 JEE 中有更多类型的存档与 tomcat 无关。此外,tomcat 的最新版本允许 "embedded mode",您根本不必使用 WAR。
  3. Spring,简而言之,就是一个IOC容器,tomcat根本就没有涉及到。我假设你知道什么是IOC,所以我不会在这个问题上深究IOC。
  4. 除了 IOC 之外,spring 还提供了与许多不同技术的相当好的集成(将其视为 Spring 可以做的另一件事)。现在在这些技术中,您可以找到 Web 框架(称为 spring MVC)、各种模板引擎(就像 JSP)、REST、使用数据库(Spring 数据)、安全模型( Spring 安全)和许多其他事情。 所有这些使得 spring 成为任何 JEE 规范实现的竞争者。 Spring 在概念上使 JEE 所做的一切(甚至可以说更多)但不遵循JEE 制定的标准。话虽如此,在现代版本中,差异变得越来越不重要,在许多情况下,Spring 确实尊重 JEE 提供的接口和注释,除了它自己的做事方式。

  5. 所以,现在很明显 Spring 和 Tomcat 并没有真正相互竞争。事实上,他们可以一起工作,这是一个非常广泛的串联: 可以使用 spring 框架来开发将 运行 on tomcat 的应用程序。 另一个成功的模型是使用 spring 引导,它允许将 tomcat 嵌入到 spring 引导应用程序中,并在后台使用它来处理 Web (HTTP/Rest) 请求。

希望这有助于理解 Spring 和 Tomcat

之间的区别