【问题标题】:Why servlet container not preferred over spring IOC container?为什么 servlet 容器不优于 Spring IOC 容器?
【发布时间】:2017-09-30 19:23:17
【问题描述】:

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

Apache tomcat 是一个开源示例。

满足javax.servlet.ServletContext 给出的契约的对象,在每个 Web 应用程序中使用


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

满足org.springframework.context.ApplicationContext 给出的契约的对象,在每个 Web 应用程序中使用


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

【问题讨论】:

  • Spring IOC 容器也实现了 Java EE 规范的 Web 组件契约:不,一点也不。 Spring MVC 是 Spring 框架的一部分,Web 框架依赖于 servlet 规范,运行在 servlet 容器中。
  • 谁更喜欢?除了您的问题基于至少两个误解之外?
  • @JBNizet 当您说 Spring MVC 时,您指的是仅来自 here 的 Servlet 模块吗?

标签: java spring tomcat servlets spring-ioc


【解决方案1】:

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

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

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

希望这能有所启发并有助于理解 Spring 和 Tomcat 之间的区别

【讨论】:

  • 为什么 Spring MVC Web 框架比 JSP 更受青睐?
  • Servlet 是低级的。它们对 HTTP 协议进行了抽象。因此,您可以使用请求、响应、标头、查询参数等概念。 MVC 建立在 servlet 之上,并提供了更高级别的抽象集:模型对象、应用控制器、它们之间的路由等。
  • @overexchange Spring MVC 也更加灵活,支持多个模板系统(我更喜欢 Thymeleaf 而不是 JSP)和其他 REST 表示,例如 JSON 和 XML(基本上包括 Jersey 所做的)。
  • Wrt 第三点,是的,我知道 Spring IoC 容器是使用 DepInjection 模式实现的。我在C_code 中使用服务定位器模式实现了 IoC。在 C 世界中,我们使用服务定位器模式来实现 IoC。 C 世界中的 IoC 主要用于插件架构(例如:绘画程序、snmp 代理等)。 Spring 在 Java 世界中跟随 IoC 的想法是什么? Servlet 容器也遵循 IoC 原则,使用web.xml url 模式匹配,来选择相应的 servlet 类。不是吗?
  • 可能在春天需要更进一步。 Spring 允许自己管理所有对象。由于您来自不支持 OOP 的 C,因此您的系统中可能会看到成百上千甚至更多的 bean(spring bean 是由 spring 管理的对象)。为什么这样做?原因很多:spring 管理sclifecle,处理初始化,使你以可测试的方式编写代码等等。在小例子中你不会看到它,但在更大的项目中它会变得更加明显。
猜你喜欢
  • 2014-04-29
  • 2010-11-23
  • 1970-01-01
  • 2012-01-26
  • 2010-09-18
  • 1970-01-01
  • 2010-10-05
  • 2015-03-18
  • 2010-11-15
相关资源
最近更新 更多