# Spring Web Framework 简介

> 原文： [https://javatutorial.net/introduction-to-spring-web-framework](https://javatutorial.net/introduction-to-spring-web-framework)

在本文中，我将解释 Spring Framework 背后的关键概念以及如何进一步使用它来构建 Web 应用程序。

![](img/d2f73752d8ae931b119dec1eac866973.jpg)

## 什么是 Spring Framework？

**Spring Framework** 是 Java 的开源应用程序容器，提供了许多有用的功能，例如控制反转，依赖注入，抽象数据访问，事务管理等。 Spring 最初由 Rod Johnson 于 2002 年作为他的书“专家一对一 J2EE 设计和开发”的三万行代码框架而引入。 该框架最初被称为“interface21”，但后来被重命名并作为开源项目发布，名称为“Spring”。 您可以在 Spring 的博客中[阅读全文](https://spring.io/blog/2006/11/09/spring-framework-the-origins-of-a-project-and-a-name)。

![Rod Johnson - creator of Spring](img/8e66751be4907e187482d41a9ff2a539.jpg)

Rod Johnson – Spring 的创造者

Spring 的第一个主要发行版本于 2004 年发布，它是 Java EE 应用程序的重大改变。 此时，J2EE 规范缺少功能且难以使用。 Spring 被接受为 J2EE 的替代品（甚至是替代品），现在仍然如此。 即使到了今天，它也具有 Java 企业版规范中没有的许多功能。

春季版本和发布时间：

*   2006 年版本 2.0 
*   2007 年版本 2.5 
*   2009 年版本 3.0 
*   2011 年版本 3.1
*   2012 年版本 3.2
*   2013 年版本 4.0 
*   2015 年版本 4.2 
*   2016 年版本 4.3
*   2017 年版本 5.0，这是最新版本

**注意**：尽管这是 Spring 教程，但与 Java EE 相比，我并不主张使用 Spring。 在此页面（Java 教程网络）上，您还将找到 [Java EE 教程](https://javatutorial.net/category/java-ee)的整个部分。 两种技术各有利弊。 Spring 提供了许多功能，甚至可以在企业容器之外运行，例如应用程序服务器等。另一方面，Java EE 已经发展成为具有可靠实现的成熟且可靠的规范。 由您决定是要实现纯 Java EE，Spring 还是两者的结合。 大型公司仍然喜欢使用 Java EE，而中型组织和初创公司更喜欢 Spring（当然，“规则”是有例外的）。 评论部分开放对此主题的争议。

## 什么是控制反转（IoC）？

Spring 的核心功能之一就是使用了控制反转（IoC）概念。 IoC 旨在颠覆传统编程模型过去在高层对象上所具有的控制流，从而处理较低层对象生命周期的创建和管理。 在 IoC 编程模型中，更高级别的对象宁愿从调用对象或外部框架接收这些依赖项的一个或多个实例。 这就是为什么 IOC 也称为“依赖项注入”的原因，其中依赖项被适当地注入，并且对象仅在程序执行时而不是在对象创建时才会麻烦自己。

简而言之，控制反转（IoC）和依赖注入（DI）模式都是要从代码中删除依赖关系。

例如，假设您的应用程序有一个地图组件，而您想提供一个解析器来翻译地图坐标。 您的标准代码如下所示：

```java
public class Map {
	private CoordinatesParser parser;

	public Map() {
		this.parser = new CoordinatesParser();
	}
}
```

在上面的代码中，我们通过使用`this.parser = new CoordinatesParser();`在`Map`和`CoordinatesParser`之间创建了依赖项。正如您所看到的，`Map`类直接依赖于`CoordinatesParser`类。

下一个示例显示如何通过使用接口和构造函数注入来避免这种情况

```java
public class Map {
	private ICoordinatesParser parser;

	public Map(ICoordinatesParser parser) {
		this.parser = parser;
	}
}
```

在上面的示例中，我们使用接口`ICoordinatesParser`而不是使用类。 这样，我们通过在`Map`构造函数签名中具有`CoordinatesParser`依赖关系类来创建抽象（而不是在类中初始化依赖关系）。 这使我们可以调用依赖项，然后将其传递给`Map`类，如下所示：

```java
ICoordinatesParser parser = new CoordinatesParser(); // dependency
Map map = new Map(parser);
```

这只是一个简单的例子。 IoC 太笼统，无法用一个严格的例子来描述。 您可以通过使用 setter 注入，构造函数注入或接口注入来实现 DI 的多种方案。

## 下一步是什么？

在接下来的教程中，我将演示如何使用 Spring 框架来构建 Web 应用程序。 您将学习如何构建 RESTful Web 服务，连接到数据库以及保护应用程序安全。