第一节:Spring简介

Spring 是一个开源框架,它是为了解决 Java 企业级应用开发复杂性而创建的,让程序员更方便地使用现有技术!

Spring 的主要优势之一是分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事。Spring 不仅限于服务器端的开发,从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益!

简单来说,Spring 是一个开源的分层的轻量的一站式的 Java 企业级框架,Spring 的中文意思是“春天”,意为它的诞生给 Java 应用开发带来了春天。

1.1:发展历史

  • 2002 年:首次推出 Spring 框架的雏形—— Interface21 框架;
  • 2004 年 3 月 24 日:Spring 框架以 interface21 为基础,经过重新设计并不断丰富其内涵,正式发布了 1.0 版本;

1.2:重要人物

在 Spring 出现之前,2002 年 10 月,Rod Johnson 撰写了一本名为《Expert One-on-One J2EE设计和开发》的书。这本书概括了当时 Java 企业应用程序开发的现状,指出了 Java EE 和 EJB 组件框架中的一些主要缺陷。在这本书中,他提出了一个基于普通 Java 类和注入依赖的更简单的解决方案。

在书中,他展示了如何在不使用 EJB 的情况下构建高质量,可扩展的在线座位预定程序。为了构建这个程序,他编写了超过 30000 行的基础结构代码(牛逼)!其中包含了大量可重用的 Java 的接口和类,例如 ApplicationContext 和 BeanFactory 等。由于 Java 的接口是依赖注入的基本构建块,他将这些类的根包命名为com.interface21,正如罗德后来解释的那样,21 这个是指 21 世纪,寓意对 21 世纪的展望。

很难令人相信,Spring 的开创者 Rod Johnson 的专业是音乐学,并不是计算机,他是悉尼大学的音乐学博士,在 Spring 发展到 3.x 版本时,于 2012 年 6 月,Rod Johnson 离开了 Spring 团队!

第二节:核心

2.1:控制反转

控制反转(IoC)是一种软件设计原则:将对象的控制权(创建和销毁)由应用程序转移到外部容器!

用比较通俗易懂的话来解释就是:在传统程序代码中,你需要什么对象就去创建什么对象,程序拥有对象的控制权;而在 Spring 中,所有的对象都在容器中登记,告诉容器你是个什么,你需要什么,然后程序在运行时,把你需要的对象主动给你,也把你交给需要你的对象!也就是说控制对象生存周期的不再是引用它的对象,而是由 Spring IoC 容器来控制所有对象的创建、销毁,这就是 Spring 的控制反转!我的个人理解:原本是程序主动创建对象,现在变成了程序告诉容器需要什么对象,由容器主动创建对象,然后把它“给”程序,类似于之前自己做饭,后来变成了点外卖!

依赖注入(DI)和控制反转(IoC)是一种包含关系,因为依赖注入是实现控制反转的一种方式!

控制反转指的是将应用程序中对象的创建和管理的控制权从应用程序代码转移到框架或容器中,而依赖注入是实现控制反转的一种机制,它通过外部配置告诉容器应该将哪些依赖注入到对象中,以实现对象之间的解耦和灵活性。换句话说,控制反转描述了一种程序设计原则,即应用程序的控制权被反转到容器中,而依赖注入是实现这种原则的具体方式。

通过依赖注入,开发人员可以将对象之间的依赖关系从代码中解耦,而不需要在代码中硬编码依赖关系,从而使得代码更加灵活、可扩展和易于维护。

在 Spring 框架中,控制反转通常通过依赖注入来实现!实现了控制反转,开发人员不再需要关注对象管理(使用 new 来创建对象,注意对象的生命周期),只需要描述对象之间的依赖关系(告诉容器你需要什么对象),可以更专注于业务逻辑!

我读过一篇对 IoC 解释比较清晰彻底的文章,推荐给你们:《认识IoC控制反转/DI依赖注入》

2.2:面向切面

面向切面(AOP)允许开发人员在不修改业务逻辑的情况下,将横切关注点从应用程序的核心逻辑中分离出来!

所谓横切关注点,就是那些通用的功能(比如日志记录、性能检测、事务管理等),将它们从应用程序代码中分离出来以后,会使得代码更加模式化,提高可维护性和可复用性。

第三节:理念

3.1:轮子理论

“轮子理论”即“不要重复发明轮子”,这是西方国家的一句谚语,原话是“Don’t reinvent the wheel”。Spring 就是在轮子理论的理念和指导原则上做出来的!

我个人理解,Spring 践行“轮子理论”的重要表现就是:对于现存的优秀技术,Spring 持赞成态度,并努力整合这些优秀的技术,并没有“重复造轮子”!

3.2:它的理念

Spring 的理念跟它的诞生息息相关,它的目的就是为了解决企业应用程序开发复杂性而创建的,它的理念就是:让现有技术更方便使用

第四节:组成

Spring 大约有 20 个功能组件,从大的方面来分,Spring 的功能组件可以分为八大模块(Spring 5)

详细信息如下:

4.1:Core Container

核心容器模块是其他模块建立的基础,由 Beans、Core、Context 和 SpEL 等组件组成。没有这些核心容器,也不可能有 AOP、Web 等上层的功能,具体介绍如下:

  • Beans 组件:提供了框架的基础部分,包括控制反转和依赖注入;
  • Core 组件:提供框架的底层部分,包括资源访问、类型转换及一些常用工具类;
  • Context 上下文组件:建立在 Core 和 Beans 模块的基础之上,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等,ApplicationContext 接口是 Context 的焦点;
  • SpEL 组件:提供了强大的表达式语言支持,支持访问和修改属性值和方法调用,访问和修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从 Spring 容器获取 Bean,也支持列表投影、选择和一般的列表聚合等;

4.2:AOP

在 Core Container 之上的 AOP 和 Aspects 提供了面向切面编程实现。其中 AOP 模块提供了面向切面编程实现,提供日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合。

4.3:Aspects

提供与 AspectJ 的集成,AspectJ 是一个功能强大且成熟的面向切面编程(AOP)框架。

4.4:Insrumentation

提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。

4.5:Messaging

Spring 4.0 以后新增了 Spring-messaging 模块,该模块提供了对消息传递体系结构和协议的支持。

4.6:Data Access/Intergration

数据访问和集成模块,包括了 JDBC、ORM、OXM、JMS 和 Transactions 模块,具体介绍如下:

  • JDBC 组件:提供了一个 JBDC 的样例模板,使用这些模板能消除传统冗长的 JDBC 编码还有必须的事务控制,而且能享受到 Spring 管理事务的好处;
  • ORM 组件:提供与流行的“对象-关系”映射框架无缝集成的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等,而且还可以使用 Spring 事务管理,无需额外控制事务;
  • OXM 组件:提供了一个支持 Object 与 XML 映射的抽象层实现,在 Java 对象和 XML 数据之间映射;
  • JMS 组件:消息服务,提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMS,JMS 用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信;
  • Transactions 组件:支持两种事务管理方式,分别是编程式和声明式;

4.7:Web

Web 模块包括 Web、Servlet、WebSocket 和 Webflux 组件,具体介绍如下:

  • Web 组件:提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IOC 容器初始化以及 Web 应用上下文;
  • Servlet 组件:提供了一个 Spring MVC Web 框架实现,Spring MVC 框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的 JSP 标签,完全无缝与 Spring 其他技术协作;
  • WebSocket 组件:提供简单接口,用户只要实现响应接口就可以快速的搭建 WebSocket Server,实现双向通讯;
  • Webflux 组件:Spring WebFlux 是 Spring Framework 5.x 中引入的新的响应式 web 框架。与Spring MVC不同,它不需要 Servlet API,是完全异步且非阻塞的,并且通过 Reactor 项目实现了 Reactive Streams 规范。Spring WebFlux 用于创建基于事件循环执行模型的完全异步且非阻塞的应用程序;

4.8:Test

Spring 支持 Junit 和 TestNG 测试框架,而且还额外提供了一些基于 Spring 的测试功能,比如在测试 Web 框架时,模拟 Http 请求的功能,包含 Mock Objects,TestContext Framework,Spring MVC Test,WebTestClient。

第五节:优点

实际上,前面三节说明的核心和理念都体现了 Spring 的优点,总结如下:

  • 开源免费:Spring 框架是一个开源免费的框架,这也注定了它强大的生命力;
  • 轻量级的:Spring 本身的包很小,只需要将其引入便可以使用;
  • 非入侵的:引入了 Spring 不会改变代码原本的任何情况,反而更加方便管理代码;
  • 控制反转
  • 面向切面
  • 支持事务:因为 AOP 的存在,Spring 框架对事务有很好的事务支持(声明式事务);
  • 一站式:Spring 对任何优秀的框架都是持赞成态度,几乎对市面上所有优秀的框架都提供了整合支持;

第六节:开发

官方网站

Spring 是一个笼统的概念,我们通常说的 Spring 框架就是指 Spring Framework,它只是大的 Spring 家族中的一个 Project!从 Spring 的官方网站 spring.io 的首页中就能看到这些 Project:

重要的是,作为一个 Java 程序员,一定要知道 Spring 的官方网址—— spring.io

官方下载地址

我 Google 了一下如何查找 Spring 的官方下载地址,网上也确实有很多教程,但是最后我发现这并没有什么卵用!因为使用 Spring 的项目基本上都是利用 Maven 去引入 JAR 包的,下载下来使用的话,要么是不会用 Maven,要么就是 JAR 包收藏爱好者!

GitHub地址

Spring 也托管在 Github 上,直接点击官网上的 Github 图标就可以访问 Spring 在 Github 上的托管项目,关于 Github 上的操作不是这篇博文的重点,不再赘述!

Maven仓库

使用 Spring 时基本上都是用 Maven 来导包的,在 Maven 的仓库中搜索spring可以搜到很多:

对于我们日常的开发来讲,只需要使用spring-webmvc即可,因为它是最庞大的包,它包含了所有的 Spring 包,比如我导入最新的版本,对应的 Maven 代码为:

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.1.3</version>
</dependency>

第七节:扩展

现代化的 Java 开发,说白了就是基于 Spring 的开发!在老版的 Spring 官网首页上,有这么一张图片:

这是官网给每一位 Java 程序员的学习路线:

  • Spring Boot:构建一切,是一个快速开发的脚手架,基于 Spring Boot 可以快速的开发单个微服务
  • Spring Cloud:协调一切,是基于 Spring Boot 的,构建的应用多了就需要使用它来进行协调;
  • Spring Cloud Data Flow:连接一切,是一个用于构建、部署和管理微服务的框架;

在 Spring Boot 没有出来之前,Spring 已经发展了很多年,由于 Spring 的理念是让现有技术更加容易使用,所以它可以整合很多的框架!但是这样就会存在一个弊端:一旦整合的框架多了,势必会存在大量的配置,人称“配置地狱”!正是在这种背景下,Spring Boot 出现了,解决了存在大量配置的情况!

Spring Boot 的主要特点是:约定大于配置!基本上只需要了解它的那些配置逻辑,按照它的规矩来开发就可以了,现在大多数公司都是使用 Spring Boot 来进行开发的。学习 Spring Boot 的前提就是需要完全掌握 Spring 和 SpringMVC!因此学习 Spring 和 SpringMVC 在学习 Java 的过程中是一个承上启下的角色!