Spring概述
概念
Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control: 反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多 著名的第三方框架和类库,逐渐成为使用最多的 Java EE 企业应用开源框架。
优势
方便解耦,简化开发 通过 Spring 提供的 IoC 容器,可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造 成的过度程序耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可 以更专注于上层的应用。
AOP 编程的支持 通过 Spring 的 AOP 功能,方便进行面向切面的编程,许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松应付。
声明式事务的支持 可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理, 提高开发效率和质量。
方便程序的测试 可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可 做的事情。
方便集成各种优秀框架 Spring 可以降低各种框架的使用难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz 等)的直接支持。
降低 JavaEE API 的使用难度 Spring 对 JavaEE API(如 JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些 API 的 使用难度大为降低。
Java 源码是经典学习范例 Spring 的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对 Java 设计模式灵活运用以 及对 Java 技术的高深造诣。它的源代码无意是 Java 技术的最佳实践的范例。
体系结构

Spring 的技术体系
Spring官方文档的简介是:Spring使Java编程更快、更简单、更安全。Spring对速度、简单性和生产力的关注使它成为世界上最流行的Java框架。
Spring是对Spring所有项目的总称,而我们常说的Spring框架是Spring Framework,它是一个轻量级控制反转(IOC)和面向切面(AOP)的容器框架
Spring Framework:Spring基础框架(核心功能为IOC/AOP),该框架使得用户创建Java EE程序变得简单和高效。
SpringMVC:Spring与MVC可以更好地解释什么是SpringMVC,MVC为现代web项目开发的一种很常见的模式,简言之 C(控制器)将 V(视图、用户客户端)与 M(模块,业务)分开构成了MVC ,业内常见的MVC模式的开发框架有Struts。Spring MVC是Spring的一部分,Spring 出来以后,大家觉得很好用,于是按照这种模式设计了一个MVC框架(一些用Spring解耦的组件),主要用于开发WEB应用和网络接口,它是Spring的一个模块,通过DispatcherServlet, ModelAndView 和View Resolver,让应用开发变得很容易。
Spirng Boot:对Spring Framework的扩展,它的初衷是解决Spring框架配置文件的繁琐、搭建服务的复杂性。它的设计理念:约定优于配置。
Spring Data:数据管理框架。主要提供了各类数据库访问和存储的功能。
Spring Cloud:**Spring Cloud是一系列框架的有序集合。它利用 Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、熔断器、数据监控等,都可以用 Spring Boot的开发风格做到一键启动和部署。**Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,基于约定大于配置原则,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。Spring Cloud就是一套分布式服务治理的框架,既然它是一套服务治理的框架,那么它本身不会提供具体功能性的操作,更专注于服务之间的通讯、熔断、监控等。因此就需要很多的组件来支持一套功能。目前常用的包含Spring Cloud Netflix和Spring Cloud Alibaba。
Spring Security:安全管理框架。主要提供用户认证和访问控制的功能。
区别与联系:
- SpringBoot专注于构建服务、而SpringCloud专注于协同管理服务
- Spring Boot是 Spring的一套快速配置脚手架,可以基于 Spring Boot快速开发单个微服务, Spring Boot专注于快速、方便集成的单个微服务个体。可以把一个SpringBoot的服务看作是一个领域的微服务。但实际的大项目中,涉及多个领域(用户领域、订单领域、支付领域等),这时分解为多个微服务,最终需要这些微服务组合起来完成功能,且保证服务的高可用性。那么Spring Cloud就是这些微服务的大管家。
1)Spring 家族技术生态全景图
访问 Spring 的官方网站 (opens new window)来对这个框架做宏观的了解。在 Spring 的主页中,展示了下面这张图:
从图中可以看到,这里罗列了 Spring 框架的七大核心技术体系,分别是微服务架构、响应式编程、云原生、Web 应用、Serverless 架构、事件驱动以及批处理。
这些技术体系各自独立但也有一定交集,例如微服务 (opens new window)架构往往会与基于 Spring Cloud 的云原生技术结合在一起使用,而微服务架构的构建过程也需要依赖于能够提供 RESTful 风格的 Web 应用程序等。
另一方面,在具备特定的技术特点之外,这些技术体系也各有其应用场景。例如,如果我们想要实现日常报表等轻量级的批处理任务,而又不想引入 Hadoop 这套庞大的离线处理平台时,使用基于 Spring Batch 的批处理框架是一个不错的选择。再比方说,如果想要实现与 Kafka、RabbitMQ 等各种主流消息中间件之间的集成,但又希望开发人员不需要了解这些中间件在使用上的差别,那么使用基于 Spring Cloud Stream 的事件驱动架构是你的首选,因为这个框架对外提供了统一的 API,从而屏蔽了内部各个中间件在实现上的差异性。在日常开发过程中,如果构建单块 Web 服务,可以采用 Spring Boot。如果想要开发微服务架构,那么就需要使用基于 Spring Boot 的 Spring Cloud,而 Spring Cloud 同样内置了基于 Spring Cloud Stream 的事件驱动架构。同时,在这里我想特别强调的是响应式编程技术。响应式编程是 Spring 5 引入的最大创新,代表了一种系统架构设计和实现的技术方向。因此,今天我们也将从 Spring Boot、Spring Cloud 以及 Spring 响应式编程这三个技术体系进行切入,看看 Spring 具体能够为我们解决开发过程中的哪些问题。
当然,所有我们现在能看到的 Spring 家族技术体系都是在 Spring Framework 基础上逐步演进而来的。Spring Framework 的整体架构如下图所示:

Spring 从诞生之初就被认为是一种容器,上图中的“核心容器”部分就包含了一个容器所应该具备的核心功能,包括容器中基于依赖注入机制的 JavaBean 处理、面向切面 AOP、上下文 Context及 Spring 自身所提供的表达式工具等一些辅助功能。
最往上就是构建应用程序所需要的最核心的两大功能组件,也是我们日常开发中最常用的组件,即数据访问和 Web 服务。这两大部分功能组件中包含的内容非常多,而且充分体现了 Spring Framework 的集成性,也就是说,框架内部整合了业界主流的数据库驱动、消息中间件、ORM 框架等各种工具,开发人员可以根据需要灵活地替换和调整自己想要使用的工具。
从开发语言上讲,虽然 Spring 应用最广泛的是在 Java EE 领域,但在当前的版本中,也支持 Kotlin、Groovy 以及各种动态开发语言。
2)Spring Boot 与 Web 应用程序
Spring Boot 构建在 Spring Framework 基础之上,是新一代的 Web 应用程序开发框架。我们可以通过下面这张图来了解 Spring Boot 的全貌:

通过浏览 Spring 的官方网站,我们可以看到 Spring Boot 已经成为 Spring 中顶级的子项目。自 2014 年 4 月发布 1.0.0 版本以来到现在,Spring Boot 俨然已经发展为 Java EE 领域开发 Web 应用程序的首选框架。让我们先来感受一下使用 Spring Boot 开发一个 RESTful风格 的 HTTP 端点所需要做的编码工作,如下所示:
@SpringBootApplication
@RestController
public class DemoApplication {
@GetMapping("/helloworld")
public String hello() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
12345678910111213
2
3
4
5
6
7
8
9
10
11
12
13
14
这是一个经典的“Hello World”程序,而且使用 Spring Boot 来构建这样一个支持 RESTful 风格的 Web 应用程序只需要几秒钟。一旦创建了一个 Spring Boot 应用程序,并添加类似上面的 DemoApplication 类,我们就可以启动 Spring Boot 内置的 Web 服务器并监听 8080 端口,剩余的一切工作 Spring Boot 都帮你自动完成了。
通过前面的描述,我们已经发现 Spring Boot 中具备了包含一个传统 Spring 框架所不具备的功能特性,那就是支持运行期内嵌容器,包含 Tomcat、Jetty 等在内的支持 Servlet 规范的多款传统 Web 容器可供开发人员进行选择。而在最新的 Spring Boot 2.X 版本中,还提供了对 Netty 以及集成 Servlet 3.1+ 的非阻塞式容器的支持。基于运行期内嵌容器机制,开发人员想要启动Web 服务只需要使用一行 java –jar 命令就可以了。
通过前面的代码示例,我们还发现 Spring Boot 的核心功能就是自动配置。在前面的示例中,我们可以看到 Spring Boot 并没有像以前使用 Spring MVC 一样需要指定一大堆关于 HTTP 请求和响应的 XML 配置。事实上,Spring Boot 的运行过程同样还是依赖于 Spring MVC,但是它把原本需要开发人员指定的各种配置项设置了默认值,并内置在了运行时环境中,例如默认的服务器端口就是 8080,如果我们不需要对这些配置项有定制化需求,就可以不做任何的处理,采用既定的开发约定即可。这就是 Spring Boot 所倡导的约定优于配置(Convention over Configuration)设计理念。
另外,相较传统的 Spring 框架,Spring Boot 的一大亮点是引入了内置的监控机制,这是通过 Actuator 组件来实现的。基于 Actuator 组件,我们一方面可以查看包含自动配置在内的应用程序详细信息,另一方面也可以实时监控该应用程序的运行时健康状态,这部分信息常见的包括内存信息、JVM 信息、垃圾回收信息等。
可以看到,Spring Boot 的上述功能实际上从多个维度简化了 Web 应用程序的开关过程,这些维度包含编码、配置、部署和监控等。
3)Spring Cloud 与微服务架构
Spring Cloud 构建在 Spring Boot 基础之上,它的整体架构图如下所示:
技术组件的完备性是 Spring Cloud 框架的主要优势,它集成了业界一大批知名的微服务开发组件。Spring Cloud 的核心组件如下图所示:
可以看到,基于 Spring Boot 的开发便利性,Spring Cloud 巧妙地简化了微服务系统基础设施的开发过程,Spring Cloud 包含上图中所展示的服务发现注册、API 网关、配置中心、消息总线、负载均衡、熔断器、数据监控等。
4)Spring 5 与响应式编程
目前,Spring 已经演进到 5.X 版本。随着 Spring 5 的正式发布,我们迎来了响应式编程(Reactive Programming)的全新发展时期。Spring 5 中内嵌了与数据管理相关的响应式数据访问、与系统集成相关的响应式消息通信以及与 Web 服务相关的响应式 Web 框架等多种响应式组件,从而极大地简化了响应式应用程序的开发过程和开发难度。
下图展示了响应式编程的技术栈与传统的 Servlet 技术栈之间的对比:
从上图可以看到,上图左侧为基于 Spring Webflux 的技术栈,右侧为基于 Spring MVC 的技术栈。我们知道传统的 Spring MVC 构建在 Java EE 的 Servlet 标准之上,该标准本身就是阻塞式和同步的,而 Spring WebFlux 基于响应式流,因此可以用来构建异步非阻塞的服务。
在 Spring 5 中,选取了 Project Reactor 作为响应式流的实现库。由于响应式编程的特性,Spring WebFlux 和 Project Reactor 的运行需要依赖于诸如 Netty 和 Undertow 等支持异步机制的容器。同时我们也可以选择使用较新版本的 Tomcat 和 Jetty 作为运行环境,因为他们支持异步 I/O 的 Servlet 3.1。下图更加明显地展示了 Spring MVC 和 Spring WebFlux 之间的区别和联系:
在基于 Spring Boot 以及 Spring Cloud 的应用程序中,Spring WebFlux 和 Spring MVC 可以混合进行使用。本文我们主要围绕 Spring Boot 框架展开讨论,分别从配置体系、数据访问、Web 服务、消息通信、系统安全、系统监控、应用测试等维度对该框架进行深入的剖析,所采用的版本为 2.2.X 版。