在软件开发中,应用框架为代码库提供基础设施支持,使编程更容易。Spring是Java领域最受欢迎的开源应用框架。Spring由多个模块和附加组件组成,术语“Spring”通常用来指代整个Spring项目族。
对于刚接触Spring生态系统的人来说,很容易混淆Spring、Spring Boot、Spring Web MVC和Spring WebFlux之间的区别。在本文为读者介绍这些概念和区别。
1 Spring
Spring Framework是其他所有Spring项目的基础,例如Spring Web MVC框架、Spring WebFlux响应式Web框架、用于自动配置和创建微服务的Spring Boot扩展。
下图显示了Spring生态系统元素之间的关系:
图片
Spring始于2003年,是一个轻量级的Java开发框架,用于帮助企业环境中采用和应用Java。Spring提供了对不同应用架构的基本支持。该框架涵盖了消息传递、事务数据和持久化以及Web。Spring还包括两个Web框架:Spring MVC和Spring WebFlux。
该框架“为现代基于Java的企业应用程序提供了全面的编程和配置模型”,无论最终部署环境如何。Spring的一个关键要素是基础设施支持。将其视为企业应用程序的“管道提供者”,使开发人员可以专注于更有价值的工作,确定业务逻辑。
1.1 Spring的主要特性
Spring的核心特性之一是依赖注入(一种应用反转原则的实现方式)。
控制反转(IoC)是一种软件设计模式,使应用程序的定制部分可以从通用框架中获取控制流。通过IoC,开发人员可以将通用任务委托给可重用的库,而不是自己编写定制代码来调用。依赖注入是IoC的一种实现方式,允许开发人员为对象提供其所依赖的其他对象,从而实现对象之间的解耦。这使得在单元测试中使用存根和模拟变得更加容易,从而方便对这些类进行测试。
与Spring相关的一个关键术语是“bean”的概念。Bean是应用程序中由Spring的IoC容器实例化、组装和管理的对象。通过依赖注入,Spring的容器将负责在创建bean时注入所有所需的依赖关系。在配置和规范应用程序逻辑时,Spring的一个独特特性是将依赖关系配置和规范与应用程序的逻辑解耦。
Spring非常适用于构建无服务器应用程序、异步应用程序和可扩展的微服务,安全性是其中的一个重点。该框架包含了促进应用程序开发的模块和功能。基本上,Spring包含了现代Web应用程序所需的所有构建模块,包括:
- 管理身份验证和授权
- 提供面向方面的编程框架
- 遵循MVC原则
- 管理事务
- 管理对关系数据库和映射器的数据访问(Spring还支持NoSQL数据库)
- 提供单元测试和集成测试支持
Spring还包括两种类型的Web框架:基于Servlet的Spring Web MVC框架和Spring WebFlux响应式Web框架。在下文中,了解更多关于Web框架的内容。
1.2 使用Spring的优势
那么为什么Spring如此受欢迎?答案可以从Spring设计的原则中找到:它既轻量级又非常灵活,提供直观的API,并提供向后兼容性,以便更容易进行维护。该框架支持应用程序开发的所有层次,通过依赖注入实现松耦合,并支持轻松进行测试。
Spring的其他好处包括:
- 支持声明式编程,例如在不描述控制流的情况下表达计算逻辑。
- 通过XML和注释配置提供配置Spring的灵活性,具体取决于您的选择。
- 通过Spring IoC或面向方面的编程(AOP)提供中间件服务,例如在开发分布式应用程序时。
2 Spring Web框架
如前所述,Spring提供了两个Web框架:Spring Web MVC和Spring WebFlux。
Spring Web MVC是最初包含在Spring框架中的Web框架,专为Servlet API和Servlet容器设计。
后来添加的Spring WebFlux是一个响应式堆栈的Web框架。
Web MVC和WebFlux可以共存,并作为可选模块工作,因此可以根据应用程序的要求使用其中一个或两个都不使用。
2.1 Spring Web MVC
Spring Web MVC是Spring框架内经常使用的Web框架。MVC是Model-View-Controller的缩写,用于设计Web应用程序的三个关键组件:
- Model:设置规则和逻辑,并包含应用程序的数据结构。
- View:定义UI逻辑,并生成用户在Web浏览器中看到的HTML输出。
- Controller:该组件提供访问应用程序行为的方式,通常通过服务接口来定义。它解释用户输入,验证它,并将其转换为将由View组件呈现给用户的模型。
Spring Web MVC的请求处理工作流程
通过这些核心组件,Spring Web MVC可以高效地将业务逻辑、展示逻辑和导航逻辑分离,这在构建模块化的Web应用程序时非常有用。
Spring Web MVC可以单独使用,作为构建Java应用程序的Spring框架的一部分。然而,使用Spring Boot,这个过程将需要更少的手动配置,使其更快、更容易。
2.2 Spring WebFlux
Spring WebFlux是一个反应式且完全非阻塞的框架,能够处理并发并实现高效扩展。在更复杂的应用程序中,反应性对于互操作性至关重要,这些应用程序需要高级别和功能丰富的API来组合异步逻辑。
WebFlux使用Reactor库,该库专注于服务器端Java,因此Reactor是一个核心依赖项。但是WebFlux实际上也可以通过Reactive Streams与其他反应式库一起使用。
使用WebFlux的好处在于:
- 支持多种服务器(包括Netty、Tomcat、Jetty、Undertow和Servlet容器)
- 提供两种编程模型的选择(注解控制器和功能性Web端点)
- 并允许选择要使用的反应式库(Reactor、RxJava或其他库)。
3 Spring Boot
Spring Boot是Spring框架的扩展,自动配置了一系列所需元素。将Spring Boot视为传统Spring的自动化版本。
使用Spring Boot可以轻松创建使用Spring框架的独立的生产级应用程序。使用Spring Boot,无需担心编写设置应用程序的样板配置,所有这些都会自动处理。
3.1 Spring Boot主要功能:
Spring Boot对Spring提供了一种见解,提供了“starter”依赖项和对Spring和第三方库的自动配置,以便快速启动。这使得Spring Boot成为从零开始引导Spring应用程序的强大工具。
Spring Boot基本上是Spring应用程序的项目初始化器,可以帮助开发人员开发用于网站和整个基于移动设备的应用程序的微服务。在检查类路径和配置的Bean后,Spring Boot会尝试自动确定和添加丢失的元素。Spring Boot自动提供默认代码和基于注解的配置,加速应用程序的开发。Spring Boot还提供了一系列可用于生产的功能,包括各种指标、健康检查和外部化配置。
Spring Boot可以与流行的内嵌式Servlet容器(包括Tomcat、Jetty和Undertow)一起使用,但Spring Boot应用程序也可以部署到与Servlet 5.0+兼容的任何容器中。
3.2 使用Spring Boot的优势
Spring Boot的主要优势在于它提供了一种简单而非常快速的构建和部署应用程序的方式。使用它有助于减少代码长度,并轻松获得Spring框架的优势。
Spring Boot提供的自动配置节省了编写代码的时间和精力成本,减少了开发时间并简化了配置。Spring Boot使你能够以符合DevOps和云友好的方式构建应用程序。它易于启动、管理和定制,并且不需要XML配置。
3.3 Spring Boot的缺点:
由于Spring Boot创建了许多未使用的依赖项,通常不适用于复杂的大型企业应用程序。这可能会导致部署文件变得很大,造成不必要的混乱。
将遗留系统替换为Spring Boot应用程序可能需要相当长的时间,并且成本可能超过收益。
3.4 Spring vs Spring Boot
应该使用纯Spring还是Spring Boot?这取决于您的需求。
Spring Boot提供了自动配置和“合理的”默认设置,用于各种Spring组件,重点是构建REST API。Spring Boot的另一个优点是,您不需要深入了解Spring就可以开始编写简单的应用程序(毕竟,大多数配置都是开箱即用的)。
对于大多数新项目,使用Spring Boot并在必要时手动调整自动配置是有意义的。这尤其适用于部署在云端或基于容器的架构上的应用程序。对于构建大型的企业级Java应用程序,Spring可能是一个更好的选择。