一、关于Spring
1.1 简介
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。它提供了全面的基础设施支持,使开发者能够专注于业务逻辑而非底层细节。
Spring 自诞生以来备受青睐,一直被广大开发人员作为 Java 企业级应用程序开发的首选。时至今日,Spring 俨然成为了 Java EE 代名词,成为了构建 Java EE 应用的事实标准。
Spring官网: https://spring.io/
1.2 诞生与发展
诞生
关于Spring的发展起源要回溯到2002年,当时正是Java EE和EJB大行其道的时候,很多知名公司都是采用此技术方案进行项目开发。这时候有一个美国的小伙子认为 EJB 太过臃肿,并不是所有的项目都需要使用 EJB 这种大型框架,应该会有一种更好的方案来解决这个问题。
他为了证明自己的想法是正确的,在2001年10月写了一本书《Expert One-on-One J2EE》,介绍了当时Java企业应用程序开发的情况,并指出了 Java EE 和 EJB 组件框架中存在的一些主要缺陷。在这本书中,他提出了一个基于普通 Java 类和依赖注入的更简单的解决方案。在书中,他展示了如何在不使用 EJB 的情况下构建高质量、可扩展的在线座位预留系统。为了构建应用程序,他编写了超过 30,000 行的基础结构代码,项目中的根包命名为 com.interface21
,所以人们最初称这套开源框架为 interface21,这就是 Spring 的前身。
这个小伙子是谁呢?他就是大名鼎鼎的 Rod Johnson(下图),Rod Johnson 在悉尼大学不仅获得了计算机学位,同时还获得了音乐学位,更令人吃惊的是在回到软件开发领域之前,他还获得了音乐学的博士学位,反正就是牛逼哄哄的人物。但是现在 Rod Johnson 已经离开了 Spring(2012 年 Rod Johnson 宣布他将要离开 Spring Source ),成为了一个天使投资人,同时也是多个公司的董事,早已走上人生巅峰。
Spring 框架的发展历程可以追溯到2003年,当时由 Rod Johnson 创建并发布了第一个版本。Spring 的初衷是为了简化企业级 Java 应用程序的开发,尤其是解决当时企业级应用开发中普遍存在的复杂性和耦合度高的问题。随着时间的推移,Spring 不断发展壮大,成为了一个完整的生态系统,涵盖了从核心的依赖注入和面向切面编程到 Web 应用开发、数据访问、安全、测试等多个领域。
发展
1. 初始版本(2003年)
- 发布:Spring 1.0 正式发布。
- 特点:主要集中于依赖注入(DI)和面向切面编程(AOP),为 Java 开发者提供了一个简洁的替代方案,减少了对 EJB 的依赖。
2. 稳定和成熟(2004-2006年)
- Spring 2.0(2006年) :引入了对注解的支持,使得配置更加灵活,简化了开发过程。
- Spring MVC:增强了 Web 应用开发的功能,提供了强大的 Model-View-Controller 支持。
3. 集成与扩展(2007-2010年)
- Spring 3.0(2009年) :引入了 RESTful Web 服务支持和 Java 5 的注解功能,进一步增强了框架的灵活性和易用性。
- 与其他技术的集成:Spring 开始与 Hibernate、JPA、Quartz 等流行技术无缝集成,扩展了其生态系统。
4. 云计算和微服务时代(2011年至今)
- Spring 4.0(2013年) :引入了对 Java 8 的支持,增加了对异步编程和 WebSocket 的支持,适应现代应用需求。
- Spring Boot(2014年) :发布了 Spring Boot,极大地简化了应用的开发和部署流程,促进了微服务架构的流行。
- Spring Cloud(2015年) :为构建分布式系统提供了一整套解决方案,帮助开发者更轻松地管理微服务。
5. 持续演进
- Spring 5.0(2017年) :引入了对反应式编程的支持,适应了现代应用对高并发和异步处理的需求。
- 生态系统的扩展:随着 Kubernetes 和云原生技术的发展,Spring 继续演进以适应新的开发趋势。
1.3 特点
Spring 框架以其灵活性、模块化和扩展性著称,它具有许多显著的特点,这些特点使得 Spring 成为 Java 开发者广泛使用的开发框架之一。以下是 Spring 框架的一些主要特点:
控制反转(IoC)容器:
- Spring提供了一个强大的IoC容器,用于管理对象的创建、生命周期、配置和其他对象的依赖关系。
依赖注入(DI) :
- Spring支持通过构造函数、setter方法和注解等方式实现依赖注入,从而降低组件之间的耦合度。
面向切面编程(AOP) :
- Spring AOP提供了一种声明式的方式来实现横切关注点,如日志记录、事务管理、安全性等。
事务管理:
- Spring提供了一个全面的事务管理抽象,支持编程式和声明式事务管理,并且可以与不同的事务管理器(如JTA、JPA等)集成。
模块化和分层架构:
- Spring框架是高度模块化的,由多个模块组成,每个模块解决特定的问题,支持分层架构,如表示层、业务层、持久层等。
数据访问抽象:
- Spring提供了对各种数据访问技术的集成,包括JDBC、Hibernate、JPA、MyBatis等,并且简化了数据库操作。
Web支持:
- Spring MVC是一个功能丰富的Web框架,用于构建Web应用程序和RESTful Web服务。Spring还支持WebSocket、Servlet、Portlet等Web技术。
安全性:
- Spring Security提供了一个全面的安全框架,用于保护基于Spring的应用程序。
测试支持:
- Spring提供了对各种测试框架的集成,如JUnit和TestNG,以及模拟对象的支持,使得单元测试和集成测试更加容易。
集成:
- Spring提供了对各种中间件、消息传递系统(如JMS、AMQP)和其他企业级技术的集成。
配置管理:
- Spring支持多种配置方式,包括XML、Java注解和Java配置类,提供了灵活的配置选项。
REST和微服务:
- Spring Boot和Spring Cloud提供了对构建RESTful服务和微服务架构的支持。
响应式编程:
- Spring 5引入了对响应式编程模型的支持,Spring WebFlux是一个响应式的Web框架,用于构建非阻塞的、事件驱动的服务。
云原生支持:
- Spring Cloud提供了对云平台的集成,支持服务发现、配置管理、负载均衡、断路器等云原生特性。
社区和生态系统:
- Spring拥有一个活跃的社区和庞大的生态系统,提供了大量的扩展库和第三方集成。
持续更新和维护:
- Spring框架定期发布新版本,不断引入新特性和改进,以适应不断变化的技术环境。
1.4 应用场景
- 企业级应用
- 传统企业应用:Spring 可用于构建大型企业级应用,支持复杂的业务逻辑和数据处理。
- Spring MVC:用于开发基于 Web 的企业应用,提供 MVC 架构,便于处理请求和响应。
- 微服务架构
- Spring Boot:通过简化配置,快速构建和部署微服务,适用于需要快速迭代和高可扩展性的项目。
- Spring Cloud:提供服务发现、负载均衡、配置管理等工具,方便微服务之间的协调和管理。
- RESTful API
- 构建 API 服务:利用 Spring MVC 构建 RESTful API,支持多种数据格式(如 JSON、XML)以供前端或其他服务调用。
- 数据访问层
- 集成 ORM 框架:通过 Spring Data 或与 Hibernate、JPA 等 ORM 框架的集成,简化数据库操作和数据访问层的开发。
- 批处理应用
- Spring Batch:专门用于处理大量数据的批处理应用,支持分片处理、事务管理和作业调度等功能。
- Web 应用
- 企业级 Web 应用:适合开发高性能、可扩展的 Web 应用,支持用户认证、权限管理和事务处理。
- 单页应用(SPA)后端
- 与前端框架结合:作为后端服务支持 React、Angular 或 Vue 等单页应用,提供数据接口和业务逻辑处理。
- 云原生应用
- 云平台部署:支持云服务(如 AWS、Azure)的集成,使得应用能够在云环境中无缝运行。
- 安全性要求高的应用
- Spring Security:用于处理用户认证和权限管理,适合需要高安全性的应用场景。
- IoT 应用
- 物联网系统:可以用于开发物联网应用,处理设备通信和数据采集等需求。
二、Spring体系结构
2.1 概览
Spring 有可能成为所有企业应用程序的一站式服务点,然而,Spring 是模块化的,允许你挑选和选择适用于你的模块,不必要把剩余部分也引入。下面的部分对在 Spring 框架中所有可用的模块给出了详细的介绍。
Spring 框架提供约 20 个模块,可以根据应用程序的要求来使用。
2.2 核心容器
核心容器由 spring-core,spring-beans,spring-context,spring-context-support和spring-expression(SpEL,Spring 表达式语言,Spring Expression Language)等模块组成,它们的细节如下:
- spring-core 模块提供了框架的基本组成部分,包括 IoC 和依赖注入功能。
- spring-beans 模块提供 BeanFactory,工厂模式的微妙实现,它移除了编码式单例的需要,并且可以把配置和依赖从实际编码逻辑中解耦。
- context 模块建立在由 core和 beans 模块的基础上建立起来的,它以一种类似于 JNDI 注册的方式访问对象。Context 模块继承自 Bean 模块,并且添加了国际化(比如,使用资源束)、事件传播、资源加载和透明地创建上下文(比如,通过 Servelet 容器)等功能。Context 模块也支持 Java EE 的功能,比如 EJB、JMX 和远程调用等。ApplicationContext 接口是 Context 模块的焦点。spring-context-support 提供了对第三方集成到 Spring 上下文的支持,比如缓存(EhCache, Guava, JCache)、邮件(JavaMail)、调度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等。
- spring-expression 模块提供了强大的表达式语言,用于在运行时查询和操作对象图。它是 JSP2.1 规范中定义的统一表达式语言的扩展,支持 set 和 get 属性值、属性赋值、方法调用、访问数组集合及索引的内容、逻辑算术运算、命名变量、通过名字从 Spring IoC 容器检索对象,还支持列表的投影、选择以及聚合等。
它们的完整依赖关系如下图所示:
对应的源码模块如下:
2.3 数据访问/集成
数据访问/集成层包括 JDBC,ORM,OXM,JMS 和事务处理模块,它们的细节如下:
(注:JDBC\=Java Data Base Connectivity,ORM\=Object Relational Mapping,OXM\=Object XML Mapping,JMS\=Java Message Service)
- JDBC 模块提供了 JDBC 抽象层,它消除了冗长的 JDBC 编码和对数据库供应商特定错误代码的解析。
- ORM 模块提供了对流行的对象关系映射 API 的集成,包括 JPA、JDO 和 Hibernate 等。通过此模块可以让这些 ORM 框架和 spring的其它功能整合,比如前面提及的事务管理。
- OXM 模块提供了对 OXM 实现的支持,比如 JAXB、Castor、XML Beans、JiBX、XStream 等。
- JMS 模块包含生产(produce)和消费(consume)消息的功能。从 Spring 4.1 开始,集成了 spring-messaging 模块。
- 事务模块为实现特殊接口类及所有的 POJO 支持编程式和声明式事务管理。(注:编程式事务需要自己写 beginTransaction()、commit()、rollback() 等事务管理方法,声明式事务是通过注解或配置由 spring 自动处理,编程式事务粒度更细)
对应的源码模块如下:
2.4 Web模块
Web 层由 Web,Web-MVC,Web-Socket 和 Web-Portlet 组成,它们的细节如下:
- Web 模块提供面向 web 的基本功能和面向 web 的应用上下文,比如多部分(multipart)文件上传功能、使用 Servlet 监听器初始化 IoC 容器等。它还包括 HTTP 客户端以及 Spring 远程调用中与 web 相关的部分。
- Web-MVC 模块为 web 应用提供了模型视图控制(MVC)和 REST Web服务的实现。Spring 的 MVC 框架可以使领域模型代码和 web 表单完全地分离,且可以与 Spring 框架的其它所有功能进行集成。
Web-Socket 模块为 WebSocket-based 提供了支持,而且在 web 应用程序中提供了客户端和服务器端之间通信的两种方式。
Webflux 模块: Spring WebFlux 是 Spring Framework 5.x中引入的新的响应式web框架。与Spring MVC不同,它不需要Servlet API,是完全异步且非阻塞的,并且通过Reactor项目实现了Reactive Streams规范。Spring WebFlux 用于创建基于事件循环执行模型的完全异步且非阻塞的应用程序。
对应的源码模块如下:
2.5 Test模块
Test 模块:Spring 支持 Junit 和 TestNG 测试框架,而且还额外提供了一些基于 Spring 的测试功能,比如在测试 Web 框架时,模拟 Http 请求的功能。
包含Mock Objects, TestContext Framework, Spring MVC Test, WebTestClient。
对应的源码模块如下:
2.6 其他
还有其他一些重要的模块,像 AOP,Aspects,Instrumentation,Web 和测试模块,它们的细节如下:
- AOP 模块提供了面向方面(切面)的编程实现,允许你定义方法拦截器和切入点对代码进行干净地解耦,从而使实现功能的代码彻底的解耦出来。使用源码级的元数据,可以用类似于.Net属性的方式合并行为信息到代码中。
- Aspects 模块提供了与 AspectJ 的集成,这是一个功能强大且成熟的面向切面编程(AOP)框架。
- Instrumentation 模块在一定的应用服务器中提供了类 instrumentation 的支持和类加载器的实现。
- Messaging 模块为 STOMP 提供了支持作为在应用程序中 WebSocket 子协议的使用。它也支持一个注解编程模型,它是为了选路和处理来自 WebSocket 客户端的 STOMP 信息。
- 测试模块支持对具有 JUnit 或 TestNG 框架的 Spring 组件的测试。
对应的源码模块如下:
三、Spring下载
3.1 官方下载
进入如下链接,依次点开:Artifacts-->snapshot-->org-->springgframework-->spring
https://repo.spring.io/ui/repos/tree/General/snapshot
选择需要的版本
打开后选择后缀为-dist.zip的下载即可
Spring的解压文件中有几个文件夹:docs、libs、schema。
docs :该文件夹下包含Spring的相关文档、开发指南及API参考文档。
libs :所有的 Spring 库都在这里,在里面我们会发现每个jar包都有三个不同后缀的文件。
***.jar :字节码jar包
***-javadoc.jar :文档
***-sources.jar :源码
schema :所有的约束(xsd)文件都在这里。
附上一键点击直达地址:
https://repo.spring.io/ui/native/snapshot/org/springframework/spring/
3.2 Maven引入
要使用Spring,现在一般都是使用maven导入spring的jar包去使用。而不用去专门下载jar包再导入。
在Maven项目中添加如下依赖,引入Sping
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>5.2.6.RELEASE</version>
<type>pom</type>
</dependency>