回顾一下
回想一下我们是怎样完成这一切的。简短来说,在构建基于 Spring 的 Taco Cloud 应用的过程中,我们执行了如下步骤:
- 使用 Spring Initializr 创建初始的项目结构;
- 编写控制器类处理针对主页的请求;
- 定义了一个视图模板来渲染主页;
- 编写了一个简单的测试类来验证工作符合预期。
这些步骤都非常简单直接,对吧?除了初始化应用的第一个步骤之外,我们所做的每一个操作都专注于生成主页的目标。
实际上,我们所编写的每行代码都致力于实现这个目标。除了 Java import 语句之外,我只能在控制器中找到两行 Spring 相关的代码,而在视图模板中一行 Spring 相关的代码都没有。尽管测试类的大部分内容都使用了 Spring 对测试的支持,但是它在测试的上下文中似乎没有那么具有侵入性。
这是使用 Spring 进行开发的一个重要收益。你可以只关注满足应用需求的代码,无须考虑如何满足框架的需求。尽管我们偶尔还是需要编写一些框架特定的代码,但是它们通常只占整个代码库很小的一部分。正如我在前文所述,Spring(以及 Spring Boot)可以视为感受不到框架的框架(frameworkless framework)。
但是这又是如何运行起来的呢?Spring 在幕后做了些什么来保证应用的需求能够得到满足呢?要理解 Spring 到底做了些什么,我们首先来看一下构建规范。
在 pom.xml 文件中,我们声明了对 Web 和 Thymeleaf starter 的依赖。这两项依赖会传递引入大量其他的依赖,包括:
- Spring 的 MVC 框架;
- 嵌入式的 Tomcat;
- Thymeleaf 和 Thymeleaf 布局方言;
它还引入了 Spring Boot 的自动配置库。当应用启动的时候,Spring Boot 的自动配置将会探测到这些库,并自动完成如下功能:
- 在 Spring 应用上下文中配置 bean 以启用 Spring MVC;
- 在 Spring 应用上下文中配置嵌入式的 Tomcat 服务器;
- 配置 Thymeleaf 视图解析器,以便于使用 Thymeleaf 模板渲染 Spring MVC 视图。
简而言之,自动配置功能完成了所有的脏活累活,让我们能够集中精力编写实现应用功能的代码。如果你问我对此的观点,那么我认为这是一个很好的安排!
我们的 Spring 之旅才刚刚开始。Taco Cloud 应用程序只涉及 Spring 所提供功能的一小部分。在开始下一步之前,我们先整体了解一下 Spring,看看在我们的路途中都会有哪些地标。
俯瞰 Spring 风景线
要想了解 Spring 的整体状况,只需查看完整版本的 Spring Initializr Web 表单上的那一堆复选框列表即可。它列出了 100 多个可选的依赖项,所以我不会在这里列出所有选项,也不会提供截图,但我鼓励你去看一看。同时,在这里我会简单介绍一些重点的项目。
Spring 核心框架
如你所料,Spring 核心框架是 Spring 领域中一切的基础。它提供了核心容器和依赖注入框架,另外还提供了一些其他重要的特性。
其中有一项是 Spring MVC,也就是 Spring 的 Web 框架。你已经看到了如何使用 Spring MVC 来编写控制器类以处理 Web 请求。但是,你还没看到的是,Spring MVC 还能用来创建 REST API,以生成非 HTML 的输出。在第 2 章中,我们将会更深入地介绍 Spring MVC,并在第 6 章重新学习如何使用它来创建 REST API。
Spring 核心框架还提供了一些对数据持久化的基础支持,尤其是基于模板的 JDBC 支持。在第 3 章中,你将会看到如何使用 JdbcTemplate。
在最新版本的 Spring 中,还添加了对反应式(reactive)风格编程的支持,其中包括名为 Spring WebFlux 的新反应式 Web 框架,这个框架大量借鉴了 Spring MVC。在第 3 部分中,我们将会学习 Spring 反应式编程模型,并在第 11 章专门学习 Spring WebFlux。
Spring Boot
我们已经看到了 Spring Boot 带来的很多收益,包括 starter 依赖和自动配置。在本书中,我们会尽可能多地使用 Spring Boot,并避免任何形式的显式配置,除非显式配置是绝对必要的。除了** starter 依赖和自动配置**,Spring Boot 还提供了大量其他有用的特性:
除此之外,Spring Boot 还提供了一个基于 Groovy 脚本的编程模型,称为 Spring Boot 命令行接口(Command-Line Interface,CLI)。使用 Spring Boot CLI,我们可以将整个应用程序编写为 Groovy 脚本的集合,并通过命令行运行它们。我们不会花太多时间介绍 Spring Boot CLI,但是当它匹配我们的需求时,我们会偶尔提及它。
Spring Boot 已经成为 Spring 开发中不可或缺的一部分,很难想象如果没有它我该如何开发 Spring 应用程序。因此,本书采用以 Spring Boot 为核心的视角。当我介绍 Spring Boot 所做的事情时,你可能会发现我却使用了 Spring 这个词。
Spring Data
尽管 Spring 核心框架提供了基本的数据持久化支持,但是 Spring Data 提供了非常令人惊叹的功能:将应用程序的数据 repository 定义为简单的 Java 接口,在定义驱动存储和检索数据的方法时使用一种命名约定即可。
此外,Spring Data 能够处理多种不同类型的数据库,包括关系型数据库(JPA)、文档数据库(Mongo)、图数据库(Neo4j)等。在第 3 章中,我们将使用 Spring Data 为 Taco Cloud 应用程序创建 repository。
Spring Security
应用程序的安全性一直是一个重要的话题,而且正在变得越来越重要。幸运的是,Spring 有一个健壮的安全框架,名为 Spring Security。
Spring Security 解决了应用程序通用的安全性需求,包括身份验证、授权和 API 安全性。Spring Security 的范围太大,在本书中无法得到充分的介绍,但是我们将在第 4 章和第 11 章中讨论一些常见的使用场景。
Spring Integration 和 Spring Batch
从一定程度上来讲,大多数应用程序都需要与其他应用甚至本应用中的其他组件进行集成。在这方面,有一些应用程序集成模式可以解决这些需求。Spring Integration 和 Spring Batch 为基于 Spring 的应用程序提供了这些模式的实现。
Spring Integration 解决了实时集成问题。在实时集成中,数据在可用时马上就会得到处理。相反,Spring Batch 解决的则是批处理集成的问题,在此过程中,数据可以收集一段时间,直到某个触发器(可能是一个时间触发器)发出信号,表示该处理批量数据了才会对数据进行批处理。我们将会在第 9 章中研究 Spring Batch 和 Spring Integration
Spring Cloud
在撰写本书的时候,应用程序开发领域正在进入一个新的时代,我们不再将应用程序作为单个部署单元来开发,而是使用由微服务组成的多个独立部署单元来组合形成应用程序。
微服务是一个热门话题,解决了开发期和运行期的一些实际问题。然而,在这样做的过程中,它们也面临着自己所带来的挑战。这些挑战将由 Spring Cloud 直面解决,Spring Cloud 是使用 Spring 开发云原生应用程序的一组项目。
Spring Cloud 覆盖了很多领域,本书不可能面面俱到,我们将在第 13 ~ 15 章中研究 Spring Cloud 的一些常见组件。要更全面地研究 Spring Cloud,我建议阅读 John Carnell 的 Spring Microservices in Action 一书(Manning,2017)。
小结
- Spring 旨在简化开发人员所面临的挑战,比如创建 Web 应用程序、处理数据库、保护应用程序以及实现微服务。
- Spring Boot 构建在 Spring 之上,通过简化依赖管理、自动配置和运行时洞察,使 Spring 更加易用。
- Spring 应用程序可以使用 Spring Initializr 进行初始化。Spring Initializr 是基于 Web 的应用,并且为大多数 Java 开发环境提供了原生支持。
- 在Spring 应用上下文中,组件(通常称为 bean)既可以使用 Java 或 XML 显式声明,也可以通过组件扫描发现,还可以使用 Spring Boot 自动配置功能实现自动化配置。
相关资料
本节实验的源码下载地址如下。
wget https://labfile.oss.aliyuncs.com/courses/2630/chap01.zip